linux - sqlite3如何编辑一个大文件?

标签 linux sqlite filesystems

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

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

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

这个问题以前在这里问过: How to edit a big file

答案建议使用 sqlite3 而不是直接文件。这让我很好奇,sqlite3 是如何解决这个问题的?

最佳答案

SQLite 是一个关系数据库。它的主要编辑手段是 btree 表和 btree 索引。 BTree 被设计为在记录增长时就地编辑。此外,SQLite 使用 .journal 文件在保存文件时从崩溃中恢复。

BTrees 只需为任何记录的主键或任何索引列支付 log (N) 查找时间(这比排序记录快得多,因为 log 基数很大)。因为 BTree 几乎到处都使用 block 指针,所以可以相对轻松地更新有序列表的中间部分。

正如 RichN 指出的那样,SQLite 会在文件中浪费空间。定期运行 VACUUM 以释放它。

顺便说一句,我已经手工编写了 BTree。它们写起来很痛苦,但如果您出于某种原因必须这样做,那是值得的。

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

相关文章:

linux - 使用ffmpeg将yuv视频转换为png帧

c++ - SQLite 查询返回 "unknown error"

sqlite - SQLite从其他表中获取值(value)

c++ - 文件修改或文件打开时的断点

c - 在运行令人尴尬的并行作业时,避免并行文件系统过载的最佳方法是什么?

c - 用于嵌入式系统/电子/控制的Linux

linux - 增加 linux 中的 shell 缓冲区大小

python - Jabber bot - 如何获取状态更新?

Sqlite:LIKE 匹配值,但相等不匹配

php - 规范化 (webdav) unicode 路径