Проблема со всеми конвейерами заключается в том, что вы, по сути, удваиваете работу. Независимо от того, насколько быстрой является распаковка, данные все равно необходимо передать другому процессу.
В Perl есть PerlIO ::gzip , который позволяет напрямую читать сжатые gzip-потоки. Следовательно, он может иметь преимущество, даже если его скорость декомпрессии может не соответствовать скорости 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]': $!";
Я попробовал это со сжатым файлом gzip размером 13 МБ (распаковывает до 1,4 ГБ )на старом MacBook Pro 2010 года с 16 ГБ ОЗУ и на старом ThinkPad T400 с 8 ГБ RAM с файлом, уже находящимся в кеше. На Mac скрипт Perl был значительно быстрее, чем при использовании конвейеров (5 секунд против 22 секунд ), но на ArchLinux он проиграл unpigz :
.
$ time -p./gzlc.pl spy.gz 1154737 real 4.49 user 4.47 sys 0.01
против
$ time -p unpigz -c spy.gz | wc -l 1154737 real 3.68 user 4.10 sys 1.46
и
$ time -p zcat spy.gz | wc -l 1154737 real 6.41 user 6.08 sys 0.86
Очевидно, что использование unpigz -c file.gz | wc -l
является выигрышным как с точки зрения скорости, так и с точки зрения скорости. И эта простая командная строка, безусловно, превосходит написание программы, какой бы короткой она ни была.
Ничто в коде, который вы показываете, не печатает вывод, который вы показываете, поэтому он должен исходить из какой-то части, которую вы не показываете.
Вы должны быть в состоянии найти виновника самостоятельно или, по крайней мере, изолировать небольшую проблемную часть со следующей информацией:
~/.bash_profile
. set -x
вверху .bash_profile
, и bash будет печатать трассировку каждой команды непосредственно перед ее выполнением. Это будет выглядеть так :+ export AD_USERNAME=myfirstname.mylastname
+ AD_USERNAME=myfirstname.mylastname
+ yodle_dev_include_repo_prompt=1
+ source /home/intA/.dev-shell-utils/conf/sh/all
…
Поэтому проверьте, какие команды (и )выводят этот нежелательный вывод.