我需要使用与此shell命令类似的Perl脚本提取25GB tar文件。
tar xvf tarFile.tar file1.txt file2.txt file3.txt ...
这就是我的尝试。
use Archive::Tar;
my $tarPath = 'path/to/tarArchive';
my $tar = Archive::Tar->new($tarPath); # Out of memory
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
}
你能帮我理解出了什么问题吗?
答案 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