gpt4 book ai didi

linux - 如何编辑一个大文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:56:07 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com