Вопрос

Я использую приведенный ниже код Perl для перечисления файлов в архиве tar.Размер архива tar всегда составляет около 15 МБ.

my $file = shift;
my $tar = Archive::Tar->new("$file");
my @lists = $tar->list_files;
$tar->error unless @lists;

Выполнение этого кода выдает мне ошибку "Не хватает памяти".У меня около 512 МБ в моей системе Linux, и я не хочу увеличивать объем памяти моей системы.Кто-нибудь, пожалуйста, может подсказать мне, можно ли изменить этот код для повышения производительности или другой код для перечисления файлов в архиве tar.

Это было полезно?

Решение

Я попробовал это на большом tar и тоже получил ошибку.Вероятно, ошибка в библиотеках.У меня сработало следующее:

@files = split/\n/, `tar tf $file`

Другие советы

От Archive::Tar Вопросы и ответы:

Разве Archive::Tar не медленный?Да, это так.Это чистый 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;
}

/И3аз/

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

$ tar tvf file.tar
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top