为什么Perl';s存档::Tar内存不足?

为什么Perl';s存档::Tar内存不足?,perl,archive-tar,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; 执行这段代码会给我一个错误“内存不足”。我的Linux系统大约有512MB,我不想增加系统的内存。有没有人能建议我是否可以修改此代码以获得更好的性能,或者使用其他代码来

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

我在大型tar上尝试了这一点,但也遇到了一个错误。可能是libs中的一个bug。 以下几点对我很有用:

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

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

$ tar tvf file.tar
发件人:

归档::Tar不是很慢吗? 是的。它是纯perl的,因此比您的/bin/tar慢很多,但是,它非常可移植。如果速度是一个问题,考虑使用/bin /TAR代替.< /P> 存档::Tar在内存上不是比/bin/Tar重吗? 是的,请参见前面的答案。由于Compress::Zlib和IO::Zlib在其文件句柄上不支持seek,因此除了将存档读入内存之外,别无选择。如果您想在内存中操纵归档文件,这是可以的

如果您只想提取,请改用extract\u archive类方法。它将立即优化并写入磁盘

另一种选择是使用iter类方法迭代tarball中的文件,而不同时读取内存中的所有文件

因此,基于上述情况,这应该是解决方案(未经测试):


/I3az/

说明语言和操作系统,以便我们可以从您的问题开始perl和OS是Linux,但问题是关于perl的Archive::Tar
my $next = Archive::Tar->iter( $file );

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