我正在使用 Python 多重处理为每个进程生成一个临时输出文件。它们的大小可能有几 GB,我制作了几十个。这些临时文件需要连接起来才能形成所需的输出,而这一步被证明是瓶颈(也是并行杀手)。是否有一个 Linux 工具可以通过修改文件系统元数据来创建连接文件,而不是实际复制内容?只要它能在任何我能接受的Linux系统上运行就行。但特定于文件系统的解决方案不会有太大帮助。
我没有接受过操作系统或计算机科学方面的培训,但从理论上讲,似乎应该可以创建一个新的索引节点,并从我想要复制的文件的索引节点复制索引节点指针结构,然后取消链接这些索引节点。有没有任何实用程序可以做到这一点?鉴于有太多经过深思熟虑的 unix 实用程序,我完全预料到它会是这样,但找不到任何东西。因此我对SO有疑问。文件系统位于块设备上,实际上是硬盘上,以防此信息很重要。我没有信心自己写这个,因为我以前从未做过任何系统级编程,所以任何指针(指向 C/Python 代码片段)都会非常有帮助。
即使有这样的工具,也只有在除最后一个文件之外的文件
保证其大小是文件系统块的倍数
尺寸。
如果您控制数据写入临时文件的方式,并且您know每个有多大,您可以执行以下操作
在开始多重处理之前,创建最终的输出文件并增长
到最终尺寸fseek() http://linux.die.net/man/3/fseek英
到最后,这将创建一个稀疏文件 http://wikipedia.org/wiki/Sparse_file.
启动多处理,将 FD 和偏移量传递给每个进程
文件的特定片段。
这样,进程将协作填充单个输出文件,
无需稍后将它们放在一起。
EDIT
如果您无法预测单个文件的大小,但该文件的使用者
最终文件可以使用顺序(而不是随机访问)输入,您可以
喂养cat tmpfile1 .. tmpfileN
给消费者,无论是在标准输入上
cat tmpfile1 ... tmpfileN | consumer
或通过命名管道(使用 bash 的进程替换):
consumer <(cat tmpfile1 ... tmpfileN)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)