【发布时间】:2013-12-30 12:52:45
【问题描述】:
我在 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 以将写入的数据量降至最低?
【问题讨论】:
-
@duffymo,我的第一种方法是使用 MySql,但每次提交它写成 200Kb,所以我迁移到我认为更适合这里的 sqlite。我知道完全写入二进制文件会更好,但我想避免手动解析它。
-
IO 包括回滚日志或 WAL,可能还有一个检查点。 Source,但请注意这是一份草稿文件。我不知道那些写入可能需要多少磁盘。
-
SQLite 确保事务的持久性正确;这需要比直接写入更多的 iops,但这也意味着当事务完成时,数据肯定在那里。
-
如果您可以在没有 ACID 的情况下使用 NoSQL 文档替代方案,但它仍然满足您的需求。这总是一个权衡。确保您没有过早优化。即使 20KB 听起来也不算多。
标签: sqlite io raspberry-pi