为什么 Perl 的 Archive::Tar 内存不足?
-
19-09-2019 - |
题
我使用下面的 Perl 代码列出 tar 存档中的文件。tar 存档的大小始终约为 15MB。
my $file = shift;
my $tar = Archive::Tar->new("$file");
my @lists = $tar->list_files;
$tar->error unless @lists;
执行此代码会出现错误“内存不足”。我的 Linux 系统大约有 512MB,我不想增加系统内存。任何人都可以建议我是否可以修改此代码以获得更好的性能或使用其他代码来列出 tar 存档中的文件。
解决方案
我试过,在一个大的焦油和得到一个错误了。大概在库中的错误。 以下为我工作:
@files = split/\n/, `tar tf $file`
其他提示
从 Archive::Tar
常问问题:
Archive::Tar 是不是很慢?是的。它是纯 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/
如果Perl是不是必须的,使用焦油
$ tar tvf file.tar
不隶属于 StackOverflow