【问题标题】:How to minimize number of bytes writen to disk by sqlite?如何最小化 sqlite 写入磁盘的字节数?
【发布时间】: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


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 2012-01-17
    • 2014-10-24
    相关资源
    最近更新 更多