5

当前流程:

  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
4

5 回答 5

7

如果您不关心文件之间的边界,那么tar --to-stdout -xf $file将做您想做的事;它会将存档中每个文件的内容一个接一个地发送到标准输出。

这假设您使用的是 GNU tar,如果您使用的是 bash,这很有可能。

[更新]

鉴于您确实希望单独处理每个文件的限制,我同意 Charles Duffy 的观点,即 shell 脚本是错误的工具。

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

于 2012-06-19T00:00:15.873 回答
4

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

于 2012-06-19T00:03:54.783 回答
4

您可以使用 tar 选项--to-command=cmd对每个文件执行命令。Tar 将文件内容重定向到命令的标准输入,并设置一些包含文件详细信息的环境变量,例如 TAR_FILENAME。焦油文档中的更多详细信息。

例如

tar zxf file.tar.gz --to-command='./process.sh'

注意 OSXbsdtar默认使用,没有这个选项。gnutar您可以改为显式调用。

于 2013-04-03T21:35:18.483 回答
2

您可以使用 ramdisk ( http://www.vanemery.com/Linux/Ramdisk/ramdisk.html ) 来处理和加载它。(我大胆假设您使用 Linux,但其他 UNIX 系统应该有相同类型的规定)

于 2012-06-19T00:06:26.030 回答
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
...
$
于 2015-08-11T09:11:06.703 回答