sqlite3如何编辑一个大文件?
How does sqlite3 edit a big file?
想象一下我的程序应该编辑一个巨大的文件。为了增加阅读时间,我使用 mmap() 然后只读出我正在查看的部分。但是,如果我想在文件中间添加一行,最好的方法是什么?
添加一行然后移动文件的其余部分是唯一的方法吗?听起来很贵。
所以我的问题基本上是:在大文件中间添加数据的最有效方法是什么?
这个问题以前在这里问过:
答案建议使用 sqlite3 而不是直接文件。这让我很好奇,sqlite3是如何解决这个问题的?
SQLite 数据库文件的内容由记录和访问这些记录的数据结构组成。 SQLite 跟踪文件的已使用部分和未使用部分(删除记录时可用。)当您添加新记录并且它适合未使用的段时,这将成为它的位置。否则它会附加到文件中。任何索引都会更新以指向新数据。更新索引可能会附加更多索引记录。 SQLite(和一般的数据库管理器)在插入新记录时不移动任何内容。
请注意,随着时间的推移,内容会分散在磁盘上。顺序记录不会彼此靠近,这可能会影响某些查询的性能。
SQLite VACUUM
命令可以删除文件中未使用的 space,并修复数据中的局部性问题。参见 VACUUM Command
SQLite 是一个关系数据库。它的主要编辑手段是 btree 表和 btree 索引。 BTree 被设计为在记录增长时就地编辑。此外,SQLite 使用 .journal
文件在保存文件时从崩溃中恢复。
BTrees 只需为任何记录的主键或任何索引列支付日志 (N) 查找时间(这比排序记录快得多,因为日志基数很大)。因为 BTree 几乎到处都使用块指针,所以可以相对轻松地更新有序列表的中间部分。
正如 RichN 指出的那样,SQLite 在文件中积累了浪费 space。 运行 VACUUM
定期释放它。
顺便说一句,我手写了BTrees。它们写起来很痛苦,但如果出于某种原因必须这样做,那是值得的。
想象一下我的程序应该编辑一个巨大的文件。为了增加阅读时间,我使用 mmap() 然后只读出我正在查看的部分。但是,如果我想在文件中间添加一行,最好的方法是什么?
添加一行然后移动文件的其余部分是唯一的方法吗?听起来很贵。
所以我的问题基本上是:在大文件中间添加数据的最有效方法是什么?
这个问题以前在这里问过:
答案建议使用 sqlite3 而不是直接文件。这让我很好奇,sqlite3是如何解决这个问题的?
SQLite 数据库文件的内容由记录和访问这些记录的数据结构组成。 SQLite 跟踪文件的已使用部分和未使用部分(删除记录时可用。)当您添加新记录并且它适合未使用的段时,这将成为它的位置。否则它会附加到文件中。任何索引都会更新以指向新数据。更新索引可能会附加更多索引记录。 SQLite(和一般的数据库管理器)在插入新记录时不移动任何内容。
请注意,随着时间的推移,内容会分散在磁盘上。顺序记录不会彼此靠近,这可能会影响某些查询的性能。
SQLite VACUUM
命令可以删除文件中未使用的 space,并修复数据中的局部性问题。参见 VACUUM Command
SQLite 是一个关系数据库。它的主要编辑手段是 btree 表和 btree 索引。 BTree 被设计为在记录增长时就地编辑。此外,SQLite 使用 .journal
文件在保存文件时从崩溃中恢复。
BTrees 只需为任何记录的主键或任何索引列支付日志 (N) 查找时间(这比排序记录快得多,因为日志基数很大)。因为 BTree 几乎到处都使用块指针,所以可以相对轻松地更新有序列表的中间部分。
正如 RichN 指出的那样,SQLite 在文件中积累了浪费 space。 运行 VACUUM
定期释放它。
顺便说一句,我手写了BTrees。它们写起来很痛苦,但如果出于某种原因必须这样做,那是值得的。