我使用
Python多处理来生成每个进程的临时输出文件.它们可以是几个GB的大小,我做了几十个.这些临时文件需要相互结合以形成所需的输出,这是证明是瓶颈的步骤(和并行杀手).是否有一个Linux工具,将通过修改文件系统元数据而不是实际复制内容来创建并行文件?只要它适用于我可以接受的任何Linux系统.但是文件系统的具体解决方案不会有太大的帮助.
我不是操作系统或CS训练,但在理论上看来,似乎应该可以创建一个新的inode并从我要复制的文件的inode中复制inode指针结构,然后取消链接这些inode.有没有什么实用程序会这样做?鉴于很多思想上的unix实用程序的滥用,我完全期望它是,但找不到任何东西.所以我的这个问题.文件系统在块设备上,实际上是硬盘,以防该信息重要.我没有信心自己写这个,因为我从来没有做过任何系统级编程,所以任何指针(对C / Python代码snipppets)将是非常有帮助的.
解决方法
即使有这样的工具,只有在最后一个文件之外的文件才有效
被保证具有大小是文件系统块的倍数
尺寸.
被保证具有大小是文件系统块的倍数
尺寸.
如果您控制数据如何写入临时文件,并且您知道
每个人将会有多大,您可以做以下操作
>在开始多处理之前,创建最终的输出文件并增长
它到最后的大小fseek()
ing
到最后,这将创造一个
sparse file.
>开始多处理,将每个进程的FD和偏移量递送到其中
文件的特定片段.
这样,进程将协同填充单个输出文件,
消除了以后将它们聚集在一起的需要.
编辑
如果你无法预测单个文件的大小,而是消费者的
最终文件可以使用顺序(而不是随机访问)输入,你可以
Feed cat tmpfile1 .. tmpfileN给消费者,无论是在stdin上
cat tmpfile1 ... tmpfileN | consumer
或通过命名管道(使用bash的Process Substitution):
consumer <(cat tmpfile1 ... tmpfileN)