【问题标题】:How to extract a large tar file如何提取一个大的 tar 文件
【发布时间】:2017-09-23 06:59:09
【问题描述】:

我需要使用类似于这个 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
}

您能帮我理解一下哪里出了问题吗?

【问题讨论】:

标签: perl tar


【解决方案1】:

似乎 Archive::Tar 通过将所有内容加载到内存中来工作。从他们的文档...

Archive::Tar 在内存上不是比 /bin/tar 重吗?

是的,请参阅上一个答案。由于“压缩::Zlib”,因此 "IO::Zlib" 不支持文件句柄上的 "seek",有 别无选择,只能将存档读入内存。这没关系,如果你 想要对存档进行内存操作。

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

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

如果你只是想提取,使用“extract_archive”类方法 反而。它将立即优化并写入磁盘。

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

另一种选择是使用“iter”类方法来迭代 压缩包中的文件,而不是一次在内存中读取它们。

看起来你已经尝试过了。


另一种选择是使用Archive::Tar::Wrapper,您猜对了,它是tar 的包装器。根据其文档,它从不在内存中存储任何内容。

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

【讨论】:

    【解决方案2】:

    为什么你不能使用反引号(`)来执行它

    tar -xvf source destiantion

    【讨论】:

    • 尝试提取一个小型的 tar 文件,看看它是否与您的代码一起工作。如果它不工作那么。您没有足够的内存来保存解压缩的文件。
    猜你喜欢
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    • 1970-01-01
    相关资源
    最近更新 更多