从tar.gz中提取文件,而不触及磁盘

zeb*_*h49 5 bash tar

当前流程:

  1. 我有一个tar.gz文件.(实际上,我有大约2000个,但这是另一个故事).
  2. 我创建一个临时目录,解压缩tar.gz文件,显示100,000个小文件(每个大约600个字节).
  3. 对于每个文件,我将其捕获到一个处理程序中,将其循环到另一个分析程序中,并保存结果.

我正在使用的机器上的临时空间几乎不能同时处理其中一个进程,更不用说它们默认发送的16(超线程双四核).我正在寻找一种方法来执行此过程而不保存到磁盘.我认为单独使用文件的性能损失tar -xf $file -O <targetname>将是令人望而却步的,但它可能是我所坚持的.

有没有办法做到这一点?

编辑:由于两个人已经犯了这个错误,我将澄清:

  • 每个文件代表一个时间点.
  • 每个文件都单独处理.
  • 一旦处理(在这种情况下是傅立叶分析的变体),每个都给出一行输出.
  • 可以将此输出组合起来以执行跨时间自相关等操作.

EDIT2:实际代码:

for f in posns/*; do
    ~/data_analysis/intermediate_scattering_function < "$f"
done | ~/data_analysis/complex_autocorrelation.awk limit=1000 > inter_autocorr.txt
Run Code Online (Sandbox Code Playgroud)

Nem*_*emo 6

如果你不关心文件之间的界限,那么tar --to-stdout -xf $file你会做你想做的事情; 它会将存档中每个文件的内容一个接一个地发送到stdout.

这假设您正在使用GNU tar,如果您使用bash,这很有可能.

[更新]

鉴于您确实希望单独处理每个文件的约束,我同意Charles Duffy认为shell脚本是错误的工具.

您可以尝试他的Python建议,或者您可以尝试Archive :: Tar Perl模块.这些中的任何一个都允许您遍历内存中tar文件的内容.


Cha*_*ffy 4

这听起来像是一个适合这项工作的工具可能不是 shell 脚本的情况。Python 有一个tarfile可以在流模式下运行的模块,让您只需一次遍历大型存档并处理其文件,同时仍然能够区分各个文件(该方法tar --to-stdout无法区分单个文件)。