9488ae7357
package duplication present in (e.g.) a profile. It shows the number of instances of each package in a closure, along with the size in bytes of each instance as well as the "waste" (the difference between the sum of the sizes of all instances and the average size). $ ./show-duplication.pl /nix/var/nix/profiles/default gcc 11 3.3.6 19293318 3.4.4 21425257 ... average 14942970, waste 149429707 coreutils 6 ... average package duplication 1.87628865979381, total size 3486330471, total waste 1335324237, 38.3017114443825% wasted This utility is useful for measuring the cost in terms of disk space of the Nix approach.
68 lines
1.2 KiB
Perl
Executable file
68 lines
1.2 KiB
Perl
Executable file
#! /usr/bin/perl -w
|
|
|
|
use strict;
|
|
|
|
{ my $ofh = select STDOUT;
|
|
$| = 1;
|
|
select $ofh;
|
|
}
|
|
|
|
my @paths = ("/nix/store");
|
|
|
|
my $tmpfile = "/tmp/nix-optimise-hash-list";
|
|
#my $tmpfile = "/data/nix-optimise-hash-list";
|
|
|
|
system("find @paths -type f -print0 | xargs -0 md5sum -- > $tmpfile") == 0
|
|
or die "cannot hash store files";
|
|
|
|
system("sort $tmpfile > $tmpfile.sorted") == 0
|
|
or die "cannot sort list";
|
|
|
|
open LIST, "<$tmpfile.sorted" or die;
|
|
|
|
my $prevFile;
|
|
my $prevHash;
|
|
|
|
my $totalSpace = 0;
|
|
my $savedSpace = 0;
|
|
|
|
my $files = 0;
|
|
|
|
while (<LIST>) {
|
|
# print "D";
|
|
/^([0-9a-f]*)\s+(.*)$/ or die;
|
|
my $curFile = $2;
|
|
my $curHash = $1;
|
|
|
|
# print "A";
|
|
my $fileSize = (stat $curFile)[7];
|
|
# print "B";
|
|
# my $fileSize = 1;
|
|
$totalSpace += $fileSize;
|
|
|
|
if (defined $prevHash && $curHash eq $prevHash) {
|
|
|
|
# print "$curFile = $prevFile\n";
|
|
|
|
$savedSpace += $fileSize;
|
|
|
|
} else {
|
|
$prevFile = $curFile;
|
|
$prevHash = $curHash;
|
|
}
|
|
|
|
print "." if ($files++ % 100 == 0);
|
|
#print ".";
|
|
|
|
# print "C";
|
|
}
|
|
|
|
print "\n";
|
|
|
|
print "total space = $totalSpace\n";
|
|
print "saved space = $savedSpace\n";
|
|
my $savings = ($savedSpace / $totalSpace) * 100.0;
|
|
print "savings = $savings %\n";
|
|
|
|
|
|
close LIST;
|