Das Problem bei allen Pipelines ist, dass Sie die Arbeit im Wesentlichen verdoppeln. Egal wie schnell die Dekomprimierung ist, die Daten müssen immer noch zu einem anderen Prozess verschoben werden.
Perl hat PerlIO :: gzip , mit dem Sie gzippte Streams direkt lesen können. Daher könnte es einen Vorteil bieten, selbst wenn seine Dekomprimierungsgeschwindigkeit nicht mit der folgenden übereinstimmt unpigz
:
#!/usr/bin/env perl
use strict;
use warnings;
use autouse Carp => 'croak';
use PerlIO::gzip;
@ARGV or croak "Need filename\n";
open my $in, '<:gzip', $ARGV[0]
or croak "Failed to open '$ARGV[0]': $!";
1 while <$in>;
print "$.\n";
close $in or croak "Failed to close '$ARGV[0]': $!";
Ich habe es mit einer komprimierten 13-MB-GZIP-Datei (dekomprimiert auf 1,4 GB) auf einem alten 2010 MacBook Pro mit 16 GB RAM und einem alten ThinkPad T400 mit 8 GB RAM versucht, wobei sich die Datei bereits im Cache befindet. Auf dem Mac war das Perl-Skript deutlich schneller als die Verwendung von Pipelines (5 Sekunden gegenüber 22 Sekunden).
$ time -p ./gzlc.pl spy.gz
1154737
echte 4,49
Benutzer 4.47
sys 0.01
gegen
$ time -p unpigz -c spy.gz | wc -l
1154737
real 3,68
Benutzer 4.10
sys 1.46
und
$ time -p zcat spy.gz | wc -l
1154737
echte 6,41
Benutzer 6.08
sys 0.86
Die Verwendung von unpigz -c file.gz | wc -l
ist hier eindeutig der Gewinner, sowohl in Bezug auf die Geschwindigkeit. Und diese einfache Befehlszeile ist mit Sicherheit besser als ein Programm zu schreiben, wie kurz es auch sein mag.