linux - 如何编辑一个大文件

标签 linux file

想象一下我的程序应该编辑一个巨大的文件。为了增加阅读时间,我使用 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.

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

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

关于linux - 如何编辑一个大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41237649/

相关文章:

linux - 从 Mac iOS 到 Linux

java - 从文件中读取特定行非常慢

c - Linux 中 chattr 的替代方法

c - 线性搜索保存到文件的结构中的元素

c++ 异常和 pthread_cancel 混淆

python - 如何在 Redhat 上找到 PYTHONPATH?

C snprintf 指定用户主目录

Java:如何将控制台输出镜像到文件

c - 输出值与两个 pthread 交错

node.js - bash:npm:在 Debian 9 中找不到命令