当前流程:
tar.gz
个文件。 (实际上,我有大约2000个,但这是另一个故事)。 tar.gz
文件,显示100,000个小文件(每个大约600个字节)。我正在使用的机器上的临时空间几乎不能同时处理其中一个进程,更不用说它们默认发送的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
答案 0 :(得分:5)
如果你不关心文件之间的界限,那么tar --to-stdout -xf $file
会做你想要的;它会将存档中每个文件的内容一个接一个地发送到stdout。
这假设您正在使用GNU tar,如果您使用bash,则很有可能。
[更新]
鉴于您确实希望单独处理每个文件的约束,我同意Charles Duffy的说法,shell脚本是错误的工具。
您可以尝试他的Python建议,或者您可以尝试Archive::Tar Perl module。这些中的任何一个都允许您遍历内存中tar文件的内容。
答案 1 :(得分:4)
这听起来像是工作的正确工具可能不是shell脚本的情况。 Python有一个tarfile
模块,可以在流模式下运行,只允许一次通过大型存档并处理其文件,同时仍然可以区分单个文件(tar --to-stdout
方法不会)。
答案 2 :(得分:4)
您可以使用tar选项--to-command=cmd
为每个文件执行命令。 Tar将文件内容重定向到命令的标准输入,并使用有关文件的详细信息设置一些环境变量,例如TAR_FILENAME。 Tar Documentation中的更多详细信息。
e.g。
tar zxf file.tar.gz --to-command='./process.sh'
请注意,OSX默认使用bsdtar
,但没有此选项。您可以明确地调用gnutar
。
答案 3 :(得分:2)
您可以使用ramdisk(http://www.vanemery.com/Linux/Ramdisk/ramdisk.html)来处理和加载它。 (我大胆地假设您使用Linux但其他UNIX系统应该具有相同类型的规定)
答案 4 :(得分:0)
tar zxvf <file.tar.gz> <path_to_extract> --to-command=cat
以上命令仅显示shell上提取文件的内容。磁盘没有变化。 tar命令应该是GNU tar。
示例日志:
$ cat file_a
aaaa
$ cat file_b
bbbb
$ cat file_c
cccc
$ tar zcvf file.tar.gz file_a file_b file_c
file_a
file_b
file_c
$ cd temp
$ ls <== no files in directory
$ tar zxvf ../file.tar.gz file_b --to-command=cat
file_b
bbbb
$ tar zxvf ../file.tar.gz file_a --to-command=cat
file_a
aaaa
$ ls <== Even after tar extract - no files in directory. So, no changes to disk
$ tar --version
tar (GNU tar) 1.25
...
$