假设我有两个大小为100G的文件。我想将它们合并为一个,然后删除它们。在linux中 我们可以使用
cat file1 file2> final_file
但是需要读取2个大文件,然后写一个更大的文件。是否可以将一个文件附加到另一个文件,以便不需要IO?由于文件的元数据包含文件的位置和长度,我想知道是否可以更改文件的元数据来进行合并,因此不会发生IO。
答案 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上)两个大文件。
也许您可能会考虑使用某种数据库。
正如亚历山大注意到的,你可以将一个大文件追加到另一个文件中,但这仍然需要大量的数据复制。