想象一下应该由我的程序编辑的大文件。为了增加读取时间,我使用mmap(),然后只读出我正在查看的部分。但是,如果我想在文件中间添加一行,那么最好的方法是什么?
是添加一行然后移动文件其余部分的唯一方法吗?这听起来很贵。
所以我的问题基本上是: 在巨大文件中添加数据的最有效方法是什么?
答案 0 :(得分:4)
在任何(大型或小型)文件(Linux或POSIX)中间插入数据的唯一方法是复制该文件(转换为新文件,然后再复制rename(2)副本作为原始文件) 。因此,您将复制其头部(直到插入点),您将数据附加到该副本,然后复制尾部(插入点之后)。您也可以考虑调用posix_fadvise(2)(甚至是Linux特定的readahead(2) ...),但这并不能减少复制所有数据的需要。可以使用mmap(2),例如替换read(2),但无论你做什么都需要你复制所有数据。
当然,如果您正在将文件中间的数据块替换为相同大小的另一个块(因此没有实际插入),则可以使用plain {{3 }} + lseek(2)
是添加一行然后移动文件其余部分的唯一方法吗?这听起来很贵。
是的,它在概念上是唯一的方式。
您应该考虑使用纯文本文件的其他内容:查看write(2)或SQLite(它们在您的用例中可能非常有效)。另见GDBM。两者都为您提供了比POSIX文件更高的抽象,因此您可以“插入”数据(当然它们仍然在内部基于和使用POSIX文件)。