【问题标题】:How to edit a big file如何编辑一个大文件
【发布时间】:2016-12-20 08:18:08
【问题描述】:

想象一个应该由我的程序编辑的巨大文件。为了增加阅读时间,我使用 mmap() 然后只读出我正在查看的部分。但是,如果我想在文件中间添加一行,那么最好的方法是什么?

是添加一行然后移动文件其余部分的唯一方法吗?听起来很贵。

所以我的问题基本上是: 在大文件中间添加数据的最有效方法是什么?

【问题讨论】:

  • 顺便说一句,当您询问“编辑”大文件时:如果您正在寻找一个好的编辑器来做这些事情,我会为您指出 VisualSlick。是的,商业产品;但根据我的经验,目前处理非常大的文件时最好的编辑器。

标签: linux file


【解决方案1】:

在任何(大或小)文件(在 Linux 或 POSIX 上)中间插入数据的唯一方法是复制该文件(复制到新文件中,然后将 rename(2) 复制为原始文件)。因此,您将复制其头部(直到插入点),将数据附加到该副本,然后复制尾部(在插入点之后)。您也可以考虑调用posix_fadvise(2)(甚至是Linux 特定的readahead(2)...),但这并不能减轻复制所有数据的需要。 mmap(2) 可能被使用,例如替换read(2),但无论做什么都需要复制所有数据。

当然,如果您碰巧将文件中间的一个数据块替换为另一个 相同 大小的块(因此没有真正的插入),您可以使用纯 lseek(2) + write(2)

是添加一行然后移动文件其余部分的唯一方法吗?听起来很贵。

是的,从概念上讲,这是唯一的方法。

您应该考虑使用其他纯文本文件:查看SQLiteGDBM(它们在您的用例中可能非常有效)。另请参阅this answer。两者都为您提供了比 POSIX 文件更高的抽象,因此让您能够“插入”数据(当然它们仍然在内部基于并使用 POSIX 文件)。

【讨论】:

  • 我认为 lseek 和 write 的“当然”部分很重要。
猜你喜欢
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2018-03-20
  • 2014-02-18
  • 2013-02-10
  • 2022-11-22
  • 2021-12-10
  • 2010-09-28
相关资源
最近更新 更多