为什么Perl的Archive :: Tar内存不足?

时间:2009-11-10 09:11:07

标签: perl archive-tar

我使用下面的Perl代码列出tar存档中的文件。 tar存档的大小总是大约15MB。

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

执行此代码会给出错误“Out of Memory”。我的Linux系统中大约有512MB,我不想增加系统内存。任何人都可以建议我,如果可以修改此代码以获得更好的性能,或者在tar存档中列出文件的其他代码。

3 个答案:

答案 0 :(得分:6)

来自Archive::Tar FAQ

  

不归档::焦油慢吗?   是的。它是纯粹的perl,所以它比你的/ bin / tar慢很多但是,它非常便携。如果速度是个问题,请考虑使用/ bin / tar。

     

不是Archive :: 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 /

答案 1 :(得分:3)

我在大型焦油上尝试过这个并且也出错了。可能是libs中的一个bug。 以下对我有用:

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

答案 2 :(得分:0)

如果Perl不是必须的,请使用tar

$ tar tvf file.tar