Как читать данные в файле .gz очень быстро в perl программировании - PullRequest
2 голосов
/ 24 января 2020

Я читаю файл .gz размером около 3 ГБ. Я копирую шаблон с помощью программы PERL. Я могу получить шаблон, но это занимает слишком много времени для обработки. Может ли кто-нибудь помочь мне, как обрабатывать очень быстро?

use strict ;
use warnings ;
use Compress::Zlib;
my $file = "test.gz";
my $gz = gzopen ($file, "rb") or die "Error Reading $file: $gzerrno";
while ($gz->gzreadline($_) > 0 ) {
if (/pattern/) {
print "$_----->PASS\n";
}
}
die "Error reading $file: $gzerrno" if $gzerrno != Z_STREAM_END;
$gz ->gzclose();

Также Можете ли вы помочь мне, что делает переменная Z_STREAM_END?

Заранее спасибо

1 Ответ

4 голосов
/ 24 января 2020

Я написал сценарий, который показывает, сколько времени занимают различные методы для чтения файла gz Я также обнаружил, что Compress::Zlib очень медленно.

use strict;
use warnings;
use autodie ':all';
use Compress::Zlib;
use Time::HiRes 'time';

my $file = '/home/con/Documents/snp150.txt.gz';
# time zcat execution
my $start_zcat = Time::HiRes::time();
open my $zcat, "zcat $file |";
while (<$zcat>) {
  #      print $_;
}
close $zcat;
my $end_zcat = Time::HiRes::time();
# time Compress::Zlib reading
my $start_zlib = Time::HiRes::time();
my $gz = gzopen($file, 'r') or die "Error reading $file: $gzerrno";
while ($gz->gzreadline($_) > 0) {#http://blog-en.openalfa.com/how-to-read-and-write-compressed-files-in-perl
#       print "$_";# Process the line read in $_
}
$gz->gzclose();
my $end_zlib = Time::HiRes::time();

printf("zlib took %lf seconds.\n", $end_zlib - $start_zlib);
printf("zcat took %lf seconds.\n", $end_zcat - $start_zcat);

Используя этот скрипт, я обнаружил, что чтение через zcat работает примерно в 7 раз быстрее (!), Чем Compress::Zlib Это будет отличаться от компьютера на компьютер и файл в файл, конечно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...