Почему в архиве Perl::Tar не хватает памяти?
-
19-09-2019 - |
Вопрос
Я использую приведенный ниже код 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