想象一下我的程序应该编辑一个巨大的文件。为了增加阅读时间,我使用 mmap() 然后只读出我正在查看的部分。但是,如果我想在文件中间添加一行,最好的方法是什么?
添加一行然后移动文件的其余部分是唯一的方法吗?听起来很贵。
所以我的问题基本上是: 在大文件中间添加数据的最有效方法是什么?
最佳答案
在任何(大或小)文件(在 Linux 或 POSIX 上)中间插入数据的唯一方法是复制该文件(到一个新文件中,然后 rename(2) 将副本作为原始文件)。因此,您将复制其头部(直到插入点),将数据附加到该副本,然后复制尾部(插入点之后)。您也可以考虑调用 posix_fadvise(2) (甚至是 Linux 特定的 readahead(2) ...)但这并不能消除复制所有数据的需要。 mmap(2)可能会被使用,例如替换 read(2)但无论您做什么,都需要复制所有数据。
当然,如果碰巧你正在用另一个相同大小的 block 替换文件中间的数据 block (所以没有真正的插入),你可以使用普通的lseek(2) + write(2)
Is the only way to add a line and then move the rest of the file? That sounds expensive.
是的,这在概念上是唯一的方法。
您应该考虑使用纯文本文件之外的其他文件:查看 SQLite或 GDBM (它们在您的用例中可能非常有效)。另见 this answer .两者都为您提供了比 POSIX 文件更高的抽象,因此使您能够“插入”数据(当然它们在内部仍然基于并使用 POSIX 文件)。
关于linux - 如何编辑一个大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41237649/