linux – SQLite WAL性能提升
我有一个在嵌入式
Linux上运行的应用程序.
我有一个带有一些表的预构建DB,每个表都有很多行(数千)和52列.我提前构建了数据库,因为我担心如果我在运行时执行’INSERT’,我将进行磁盘碎片,所以我首先使用大量垃圾’INSERT’并在运行时构建数据库我使用’更新’. 我每隔3秒就向DB写入大量数据.为了使写入过程快速,我在SQLite中使用WAL模式.虽然,我有性能问题.似乎每当检查点发生时,它需要太长时间,处理器不能在不到3秒的时间内完成. 所以现在,似乎情况更好但是WAL文件变得越来越大…… 解决方法
为了避免碎片并消除预插入数据的需要,您应该使用带有
SQLITE_FCNTL_CHUNK_SIZE的sqlite3_file_control()来设置块大小.以大块(例如,每次1MB)分配数据库文件空间应该减少文件系统碎片并提高性能. Mozilla项目是
currently using this setting,在Firefox / Thunderbird中有
great success.
关于WAL.如果您经常编写大量数据,则应考虑将写入包装到更大的事务中.通常,每个INSERT都是自动提交的,SQLite必须等到数据真正刷新到磁盘或闪存 – 这显然非常慢.如果将多个写入包装到一个事务中,SQLite不必担心每一行,并且可以一次刷新多行,最有可能是单个闪存写入 – 这要快得多. 根据我的经验,WAL on flash并没有真正起作用,我发现坚持旧的日记模式更有利.例如,Android 4不为其SQLite数据库使用WAL模式,可能是有原因的.正如您所注意到的,在某些情况下,WAL有一种无限制增长的趋势(但是,如果事务很少发生,它也会发生 – 所以一定要偶尔这样做). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |