如何合并2个大文件

时间:2012-11-16 05:37:17

标签: linux file merge

假设我有两个大小为100G的文件。我想将它们合并为一个,然后删除它们。在linux中 我们可以使用

cat file1 file2> final_file

但是需要读取2个大文件,然后写一个更大的文件。是否可以将一个文件附加到另一个文件,以便不需要IO?由于文件的元数据包含文件的位置和长度,我想知道是否可以更改文件的元数据来进行合并,因此不会发生IO。

3 个答案:

答案 0 :(得分:25)

您可以合并两个文件而无需将一个文件写入另一个文件吗?

仅在晦涩的理论中。由于磁盘存储始终基于块和文件系统因此将内容存储在块边界上,因此如果第一个文件在块边界上完美结束,则只能将一个文件附加到另一个文件而不进行重写。有一些罕见的文件系统配置use tail packing,但这只有在第一个文件已经使用前一个文件的尾区时才有用。

除非出现完美的情况或者您的文件系统能够在文件中间标记部分块(我从未听说过这个),否则这不会起作用。只是为了解决边缘问题,除了更改内核interace以进行此类调用之外,还没有办法(re:Link to a specific inode

我们能否将这两个文件的大小加倍?

,我们可以改为使用追加(>>)操作。

cat file2 >> file1

这仍将导致file2消耗所有空间两次,直到我们删除它为止。

我们可以避免使用额外的空间吗?

即可。除非有人带回我不知道的东西,否则你在那里基本上没有运气。它有可能truncate一个文件,忘记了它的结尾的存在,但除非我们直接修改inode并且必须改变,否则没有办法忘记启动的存在文件系统的内核接口,因为它绝对不是POSIX操作。

一次写一点,然后删除我们写的内容呢?

不再。由于我们无法关闭文件的开头,因此我们必须重写从感兴趣点到文件末尾的所有内容。对于IO而言,这将是非常昂贵的,并且只有在我们已经读取了一半文件后才有用。

稀疏文件怎么样?

可能!稀疏文件允许我们存储一长串零而不占用太多空间。如果我们从最后开始以大块的形式阅读file2,我们可以将这些块写到file1的末尾。 file1会立即查看(和读取),就好像它们两者的大小相同,但是在我们完成之前它会被破坏,因为我们没有写完的内容会充满零。

解释所有这些本身就是另一个答案,但是如果你可以进行备用分配,你将只能使用你的块读取大小+一点额外的磁盘空间来执行此操作。有关在文件中间讨论稀疏块的参考,请参阅http://lwn.net/Articles/357767/或进行涉及术语SEEK_HOLE的搜索。

为什么这可能"也许"而不是"是"?两部分:您必须编写自己的工具(至少我们在适当的网站上),稀疏文件不受文件系统和其他进程的普遍尊重。幸运的是,你可能不必担心其他进程尊重你的文件,但你必须担心设置正确的标志并确保你的文件系统是合适的。最后,你仍然在阅读和重写file2的长度,这不是你想要的。这种方法确实意味着你只需要少量的磁盘空间,而不是使用至少2*file2的空间。

答案 1 :(得分:6)

你可以这样做

cat file2 >> file1

file1将成为完整内容。

答案 2 :(得分:0)

不,不可能通过处理他们的元数据来合并(在Linux上)两个大文件。

也许您可能会考虑使用某种数据库。

正如亚历山大注意到的,你可以将一个大文件追加到另一个文件中,但这仍然需要大量的数据复制。