如何最小化sqlite写入磁盘的字节数?

时间:2013-12-30 12:52:46

标签: sqlite io raspberry-pi

我在Raspberry Pi上使用sqlite来存储传感器读数。表结构很简单:

CREATE TABLE IF NOT EXISTS sensors(id INTEGER PRIMARY KEY AUTOINCREMENT, codename TEXT, name TEXT)
CREATE TABLE IF NOT EXISTS sensorvalues(id INTEGER PRIMARY KEY AUTOINCREMENT, sensorid INTEGER, value DECIMAL(10,2), time DATETIME, FOREIGN KEY(sensorid) REFERENCES sensors(id))

每次我将记录插入'sensorvalues'表(大约20个字节的数据)时,iotop显示写入大约30Kb的磁盘。 为了保护SD卡免受损坏,我想尽量减少写入永久内存的数据。我知道写入正好20个字节是不可能的,因为IO操作使用页面结构和缓冲区,但是每次提交写入30Kb似乎太多了。 有没有办法调整sqlite以最大限度地减少写入数据的数量到最低要求?

1 个答案:

答案 0 :(得分:0)

插入这些表需要更新表和索引,并且为了在崩溃情况下的可靠性,数据库首先将旧数据写入回滚日志,然后更新数据库文件本身,然后删除回滚日志

您可以使用PRAGMA journal_mode = memory和/或PRAGMA synchronous = off禁用安全功能,但

  

如果在设置MEMORY日记模式时,使用SQLite的应用程序在事务中间崩溃,那么数据库文件很可能会损坏。

对于许多插入,WAL mode可能更有效。