为啥 Perl 的 Archive::Tar 内存不足?

Posted

技术标签:

【中文标题】为啥 Perl 的 Archive::Tar 内存不足?【英文标题】:Why does Perl's Archive::Tar run out of memory?为什么 Perl 的 Archive::Tar 内存不足? 【发布时间】:2009-11-10 09:11:06 【问题描述】:

我正在使用下面的 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 存档中的文件。

【问题讨论】:

说明语言和操作系统,以便我们从您的问题开始 它的perl和操作系统是Linux 【参考方案1】:

来自Archive::TarFAQ:

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/

【讨论】:

【参考方案2】:

我在一个大的 tar 上尝试过,但也出现了错误。可能是库中的错误。 以下对我有用:

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

【讨论】:

【参考方案3】:

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

$ tar tvf file.tar

【讨论】:

但问题是关于 Perl 的 Archive::Tar

以上是关于为啥 Perl 的 Archive::Tar 内存不足?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Perl 从巨大的存档中提取单个

在 perl 中创建和读取 tar.bz2 文件

为啥当 `perl -V:ptrsize` 返回 4 时我能够加载 4.19 GB 的内存?

为啥 Perl 5 的函数原型不好?

Perl:为啥在循环中声明(我的)变量会更慢?

为啥perl对象实例会互相覆盖