2009-11-10 3 views
5

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

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

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

+0

государственный язык наряду с системой operting, так что мы можем начните с вашей проблемы –

+0

его perl и ОС Linux – Space

ответ

3

Я пробовал это на большой дегте и получил ошибку. Вероятно, ошибка в libs. Следующие работал для меня:

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

, если Perl не является обязательным, использовать деготь

$ tar tvf file.tar 
+0

Но вопрос только в Perl's Archive :: Tar – Celada

6

От Archive::TarFAQ:

Не Архив :: Tar медленно? Да, это так. Это чистый perl, поэтому он намного медленнее, чем ваш/bin/tar. Однако он очень портативен. Если скорость является проблемой, используйте вместо этого/bin/tar.

Не архив: Тар тяжелее памяти, чем/bin/tar? Да, см. Предыдущий ответ. Поскольку Compress :: Zlib и поэтому IO :: Zlib не поддерживает поиск в своих дескрипторах файлов, выбора нет, но читать архив в память. Это нормально, если вы хотите делать манипуляции с памятью в памяти.

Если вы просто хотите извлечь, используйте вместо этого метод класса extract_archive. Он автоматически оптимизирует и записывает на диск.

Другой вариант - использовать метод класса iter для перебора файлов в tarball без одновременного чтения их всех в памяти.

 

Так на основе выше, то это должно быть решение (непроверенные):

my $next = Archive::Tar->iter($file); 

while (my $f = $next->()) { 
    say $f->name; 
} 

/I3az/

Смежные вопросы