如何提取大型tar文件

时间:2017-04-26 03:41:33

标签: perl tar

我需要使用与此shell命令类似的Perl脚本提取25GB tar文件。

tar xvf tarFile.tar file1.txt file2.txt file3.txt ...

这就是我的尝试。

解决方案1.给出内存不足错误。

use Archive::Tar;

my $tarPath    = 'path/to/tarArchive';

my $tar        = Archive::Tar->new($tarPath); # Out of memory

解决方案2.给出内存不足错误。

use Archive::Tar;

my $tarPath    = 'path/to/tarArchive';

my $tar        = Archive::Tar->iter($tarPath, 1, { filter => qr/file1\.txt$/ } );

while ( my $f = $tar->() ) {

    print $f->name, "\n";  # Out of memory
}

你能帮我理解出了什么问题吗?

2 个答案:

答案 0 :(得分:3)

似乎Archive :: Tar的工作方式是将所有内容加载到内存中。来自他们的文档...

  

归档:: Tar的内存比/ bin / tar更重?

     

是的,请参阅上一个答案。因为" Compress :: Zlib"因此           " IO :: zlib的"不支持"寻求"在他们的文件句柄上,有           别无选择,只能将存档读入内存。如果你这没关系           想要对存档进行内存操作。

请注意,此限制可能不再存在,Compress :: Zlib现在提供gzseek,但IO :: Zlib还不支持它。

它继续提供一些解决方法。

  

如果您只想提取,请使用" extract_archive"类方法           代替。它会立即优化并写入磁盘。

那将是my @extracted_files = Archive::Tar->extract_archive($file)然后您可以使用磁盘上的文件。

  

另一种选择是使用" iter"迭代的类方法           tarball中的文件不会立即将它们全部读入内存中。

看起来你已经尝试过了。

另一种选择是使用Archive::Tar::Wrapper,你猜对了,tar的包装。根据它的文档,它从不在记忆中存储任何东西。

  

Archive :: Tar :: Wrapper是围绕' tar'的API包装器。命令行实用程序。 它从不在内存中存储任何内容 ,而是在磁盘上的临时目录结构上工作。它提供了tarball中的逻辑路径和“真实”之间的映射。磁盘上临时目录中的文件。

答案 1 :(得分:-1)

为什么不能使用反引号(`)

执行它

tar -xvf source destiantion