Почему в Perl's Archive::Tar не хватает памяти?
Я использую ниже Perl-код для перечисления файлов в архиве tar. Размер архива tar всегда около 15MB.
my $file = shift;
my $tar = Archive::Tar->new("$file");
my @lists = $tar->list_files;
$tar->error unless @lists;
Выполнение этого кода выдает ошибку "Недостаточно памяти". У меня в системе Linux около 512 МБ, и я не хочу увеличивать память моей системы. Может ли кто-нибудь предложить мне, если этот код может быть изменен для повышения производительности или другой код для перечисления файлов в архиве tar.
3 ответа
Я попробовал это на большом смоле и тоже получил ошибку. Вероятно, ошибка в библиотеках. Следующее работало для меня:
@files = split/\n/, `tar tf $file`
От Archive::Tar
FAQ:
Разве Архив:: Тар медленно? Да, это. Это чистый Perl, поэтому он намного медленнее, чем ваш / bin / tar. Однако он очень переносим. Если скорость - проблема, рассмотрите использование / bin / tar вместо этого.
Разве архив:: Tar не тяжелее в памяти, чем / bin / tar? Да, смотрите предыдущий ответ. Так как Compress:: Zlib и, следовательно, IO:: Zlib не поддерживают поиск по их файловым дескрипторам, у вас нет другого выбора, кроме как читать архив в память. Это нормально, если вы хотите делать архивирование в памяти.
Если вы просто хотите извлечь, используйте вместо этого метод класса extract_archive. Он оптимизирует и сразу записывает на диск.
Другой вариант - использовать метод класса iter для перебора файлов в архиве, не считывая их все в памяти сразу.
Таким образом, исходя из вышеизложенного, это должно быть решение (не проверено):
my $next = Archive::Tar->iter( $file );
while ( my $f = $next->() ) {
say $f->name;
}
/ I3az /