Linux SQLite-WAL性能改进

Linux SQLite-WAL性能改进,linux,sqlite,Linux,Sqlite,我有一个在嵌入式linux上运行的应用程序。 我有一个预构建的数据库,其中有一些表,每个表都有很多行(数千行)和52列。我提前构建了数据库,因为我担心如果在运行时执行“插入”,会导致磁盘碎片,因此我首先构建一个数据库,其中包含大量垃圾“插入”,在运行时使用“更新” 我每3秒钟向数据库写入大量数据,为了加快写入过程,我在SQLite中使用WAL模式。不过,我有一个问题的表现。似乎每当出现检查点时,都会花费很长时间,处理器无法在3秒内完成。 为了改进这一点,我创建了一个线程,在写了10次调用之后,它

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

我每3秒钟向数据库写入大量数据,为了加快写入过程,我在SQLite中使用WAL模式。不过,我有一个问题的表现。似乎每当出现检查点时,都会花费很长时间,处理器无法在3秒内完成。 为了改进这一点,我创建了一个线程,在写了10次调用之后,它从主线程接收消息队列,而不是检查点

所以现在,情况似乎有所好转,但沃尔玛的档案越来越大。。。
如何在这里工作?

在WAL模式下,SQLite将任何更改的页面写入
-WAL
文件。 只有在检查点期间,这些页面才会写回数据库文件

只有在没有任何并发读卡器的情况下,
-wal
文件才能被截断


您可以尝试通过调用
SQLITE\u CHECKPOINT\u RESTART
或执行来显式清除WAL文件,但如果存在任何并发读卡器,这将失败。

为了避免碎片并消除预插入数据的需要,您应该使用
sqlite3\u file\u control()
设置块大小。将数据库文件空间分配为大块(比如一次1MB),可以减少文件系统碎片并提高性能。Mozilla项目位于Firefox/Thunderbird中

关于沃尔。如果你经常写大量的数据,你应该考虑把你的文章打包成更大的事务。通常,每个插入都是自动提交的,SQLite必须等待数据真正刷新到磁盘或闪存中,这显然非常慢。如果将多个写操作包装到一个事务中,SQLite就不必担心每一行,并且可以一次刷新多行,很可能是一次闪存写操作,这要快得多。 因此,如果可以的话,尝试将至少几百次写入打包到一个事务中


根据我的经验,WAL on flash并不是很好,我发现坚持旧的日志模式更有益。例如,Android4的SQLite数据库不使用WAL模式,这可能是有原因的。正如您所注意到的,在某些情况下,WAL有无约束增长的趋势(但是,如果事务很少提交,也会发生这种情况,因此请确保偶尔提交一次)。

请注意,这会影响数据库文件的文件空间分配。据我所知,对WAL文件的分配不符合块大小。