在Linux上快速连接多个文件

san*_*san 12 linux parallel-processing copy cat

我正在使用Python多处理为每个进程生成一个临时输出文件.它们的大小可以是几GB,我可以制作几十个.这些临时文件需要合并以形成所需的输出,这是证明是瓶颈(和并行杀手)的步骤.是否有一个Linux工具可以通过修改文件系统元数据而不是实际复制内容来创建连接文件?只要它适用于我可以接受的任何Linux系统.但是文件系统特定的解决方案不会有太大帮助.

我不是OS或CS的训练,但在理论上似乎应该有可能创造一个新的inode并复制了从我想从复制文件的inode的inode的指针结构,然后取消与这些索引节点.是否有任何实用程序可以做到这一点?考虑到经过深思熟虑的unix实用程序的过多,我完全可以预料到它,但找不到任何东西.因此我的问题是关于SO的.文件系统位于块设备上,实际上是硬盘,以防这些信息很重要.我没有信心自己编写这个,因为我以前从未做过任何系统级编程,所以任何指针(对C/Python代码的反转)都会非常有用.

Mar*_*utz 14

即使有这样的工具,只有当除了最后一个文件之外的文件的大小是文件系统块大小的倍数时,这才有效.

如果您控制将数据写入临时文件的方式,并且您知道 每个文件的大小,则可以执行以下操作

  1. 在开始多处理之前,创建最终输出文件,并将其扩展到最终大小 fseek(),这将创建一个 稀疏文件.

  2. 开始多处理,将每个进程FD和偏移量交给文件的特定片段.

这样,进程将协作填充单个输出文件,从而无需在以后将它们组合在一起.

编辑

如果您无法预测单个文件的大小,但最终文件的使用者可以使用顺序(而不是随机访问)输入,您可以cat tmpfile1 .. tmpfileN在stdin上提供给使用者

cat tmpfile1 ... tmpfileN | consumer
Run Code Online (Sandbox Code Playgroud)

或者通过命名管道(使用bash的Process Substitution):

consumer <(cat tmpfile1 ... tmpfileN)
Run Code Online (Sandbox Code Playgroud)


NPE*_*NPE 5

您表明您事先并不知道每个临时文件的大小.考虑到这一点,我认为最好的办法是编写一个FUSE文件系统,它将块作为单个大文件呈现,同时将它们保存为底层文件系统上的单个文件.

在此解决方案中,您的生产和使用应用程序保持不变.制作人写出了一堆FUSE图层显示为单个文件的文件.然后将该虚拟文件呈现给消费者.

FUSE具有一堆语言的绑定,包括Python.如果你在这里这里看一些例子(这些是针对不同的绑定),这需要很少的代码.