Почему в 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 /

Если Perl не обязателен, используйте tar

$ tar tvf file.tar
Другие вопросы по тегам