【问题标题】: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

标签: perl archive-tar


【解决方案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
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-13
      • 2013-01-07
      • 1970-01-01
      • 1970-01-01
      • 2020-07-01
      • 2012-08-12
      相关资源
      最近更新 更多