gpt4 book ai didi

linux - SQLite WAL 性能改进

转载 作者:IT王子 更新时间:2023-10-29 01:17:11 25 4
gpt4 key购买 nike

我有一个在嵌入式 Linux 上运行的应用程序。我有一个预建的数据库,其中有一些表,每个表都有很多行(数千)和 52 列。我提前构建了数据库,因为我担心如果我在运行时执行“插入”,我会产生磁盘碎片,所以我先构建一个带有大量垃圾“插入”的数据库,然后在运行时我使用“更新”。

我每 3 秒向数据库写入大量数据,为了加快写入过程,我在 SQLite 中使用 WAL 模式。虽然,我有性能问题。好像每当checkpoint出现的时候,时间太长了,processor做不到不到3秒。为了改进这一点,我创建了一个线程,在大约 10 次写入调用之后,它从主线程接收消息队列,而不是检查点。

所以现在,好像情况好些了,但是WAL文件越来越大了。。。我怎样才能在这里工作?

最佳答案

为避免碎片并消除预插入数据的需要,您应该使用 sqlite3_file_control()SQLITE_FCNTL_CHUNK_SIZE设置 block 大小。以大块(比如一次 1MB)的形式分配数据库文件空间,应该可以减少文件系统碎片并提高性能。 Mozilla 项目是 currently using this setting在 Firefox/Thunderbird 中使用 great success .

关于 WAL。如果您经常写入大量数据,则应考虑将写入包装到更大的事务中。通常,每个 INSERT 都是自动提交的,SQLite 必须等到数据真正刷新到磁盘或闪存 - 这显然非常慢。如果你将多个写入包装到一个事务中,SQLite 不需要担心每一行,并且可以一次刷新许多行,很可能进入单次闪存写入 - 这要快得多。因此,如果可以,请尝试将至少数百次写入包装到一个事务中。

根据我的经验,闪存上的 WAL 并不是很好用,我发现坚持使用旧的日志记录模式更有益。例如,Android 4 不为其 SQLite 数据库使用 WAL 模式,这可能是有原因的。正如您所注意到的,WAL 在某些情况下有无限增长的趋势(但是,如果很少提交事务,也会发生这种情况 - 所以一定要偶尔这样做)。

关于linux - SQLite WAL 性能改进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13393866/

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