快速连接Linux上的多个文件

我正在使用Python多处理为每个进程生成临时输出文件。 他们可以是几个GB的大小,我做了几十个这些。 这些临时文件需要被拼接以形成所需的输出,这是被certificate是瓶颈的一步(和一个平行杀手)。 有没有一个Linux工具,通过修改文件系统的元数据,而不是实际上复制内容来创buildconcate文件? 只要它能在任何可以接受的Linux系统上运行。 但是一个文件系统特定的解决scheme不会有太大的帮助。

我不是操作系统或CS的训练,但理论上,它似乎应该是可以创build一个新的inode,并从我想复制的文件的索引节点复制索引节点指针结构,然后取消链接这些索引节点。 是否有任何实用工具可以做到这一点? 考虑到经过深思熟虑的unix公用事业,我完全期待它,但找不到任何东西。 所以我的问题就是这个。 文件系统实际上是一个块设备,一个硬盘,如果这个信息很重要的话。 我没有信心自己写这个,因为我以前从来没有做过任何系统级编程,所以任何指针(对于C / Python代码snipppets)都是非常有帮助的。

Solutions Collecting From Web of "快速连接Linux上的多个文件"

即使有这样一个工具,只有当最后一个文件的大小保证是文件系统块大小的倍数时才能工作。

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

  1. 在开始多处理之前,创建最终的输出文件,并通过fseek()结束将其增大到最终的大小,这将创建一个稀疏文件 。

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

通过这种方式,这些进程将协作地填充单个输出文件,而不需要稍后将它们集合起来。

编辑

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

 cat tmpfile1 ... tmpfileN | consumer 

或通过命名管道(使用bash的进程替换):

 consumer <(cat tmpfile1 ... tmpfileN) 

你表示你不知道每个临时文件的大小。 考虑到这一点,我认为最好的办法是编写一个FUSE文件系统,将文件块作为一个单独的大文件进行显示,同时将它们保存为底层文件系统上的单个文件。

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

FUSE绑定了一堆语言, 包括Python 。 如果你看看这里或这里的一些例子(这些是不同的绑定),这需要惊人的少量代码。

我不这么认为,inode可能是对齐的,所以只有在一个文件的页脚和另一个文件的标题之间留下一些零(或未知字节)的情况下才可能。

我不建议连接这些文件,而是建议重新设计分析工具以支持从多个文件采购。 以日志文件为例,许多日志分析器支持每天读取日志文件。

编辑

@san:正如你所说的代码在使用中你无法控制,那么你可以通过使用命名管道来实时连接单独的文件:

 $ mkfifo /tmp/cat $ cat file1 file2 ... >/tmp/cat & $ user_program /tmp/cat ... $ rm /tmp/cat 

对于4个文件; xaa,xab,xac,xad bash中的快速连接(以root身份):

 losetup -v -f xaa; losetup -v -f xab; losetup -v -f xac; losetup -v -f xad 

(让我们假设loop0,loop1,loop2,loop3是新设备文件的名称。)

http://pastebin.com/PtEDQH7G放入“join_us”脚本文件中&#x3002; 那么你可以像这样使用它:

 ./join_us /dev/loop{0..3} 

然后(如果这个大文件是一个电影),你可以把它的所有权给普通用户(chown itsme / dev / mapper / joined),然后他/她可以通过以下方式播放:mplayer / dev / mapper / joined

这些后清理(作为根):

 dmsetup remove joined; losetup -d /dev/loop[0123] 

不,没有这样的工具或系统调用。

您可能会调查每个进程是否可以直接写入最终文件。 说进程1写入字节0-X,进程2写入X-2X等。

一个可能的选择是将所有的临时文件都归入命名管道,然后使用该命名管道作为单输入程序的输入。 只要你的单一输入程序只是顺序读取输入,而不寻求。