Почему в Perl's Archive :: Tar не хватает памяти? - PullRequest
5 голосов
/ 10 ноября 2009

Я использую приведенный ниже код 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 ]

6 голосов
/ 10 ноября 2009

С Archive::Tar FAQ :

Разве архив не :: 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;
}

/ I3az /

3 голосов
/ 10 ноября 2009

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

@files = split/\n/, `tar tf $file`
0 голосов
/ 10 ноября 2009

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

$ tar tvf file.tar
...