想象一下,我的程序应该编辑一个巨大的文件。为了增加读取时间,我使用mmap(),然后只读取正在查看的部分。但是,如果我想在文件的中间添加一行,那么最好的方法是什么?
是添加一行然后移动文件其余部分的唯一方法吗?听起来很贵。
所以我的问题基本上是:在一个巨大的文件中添加数据的最有效的方法是什么?
发布于 2016-12-20 08:21:15
在任何(大型或小型)文件(在Linux或POSIX上)中间插入数据的唯一方法是将该文件复制(到一个新的文件中,然后将副本作为原始的重命名(2) )。因此,您将复制它的头(直到插入点),将数据附加到该副本,然后复制尾(在插入点之后)。您也可以考虑调用财务咨询(2) (甚至是特定于Linux的readahead(2).)但这并不说明有必要复制所有数据。可以使用mmap(2)来替换读(2),但是无论您做什么,都需要复制所有的数据。
当然,如果您正在将文件中间的数据块替换为另一个大小相同的块(因此没有真正的插入),则可以使用普通的伊莉斯(2) + 写(2)。
是添加一行然后移动文件其余部分的唯一方法吗?听起来很贵。
是的,这在概念上是唯一的办法。
您应该考虑使用其他简单的文本文件:查看SQLite或GDBM (它们在您的用例中可能非常有效)。另见这个答案。这两种方法都为您提供了比POSIX文件更高的抽象,因此您可以“插入”数据(当然,它们在内部仍然是基于和使用POSIX文件的)。
https://stackoverflow.com/questions/41237649
复制相似问题