【问题标题】:sqlite3 when disk storage reachedsqlite3 当磁盘存储达到
【发布时间】:2016-07-25 09:58:26
【问题描述】:

我有一个 2M 字节的存储空间来在我们的嵌入式设备(linux 基础)中存储一些日志。由于尺寸非常有限,我们必须实施一些方法来处理达到最大尺寸的情况。一种选择是带有 mmap 的循环缓冲区以实现持久性。我们正在考虑的另一个选项是使用 sqlite3(当达到最大大小时,删除最旧的条目,插入新条目)。

但是,据我了解,sqlite3 使用页面(限制 4096K 或可配置)。我的问题是:

  1. 如何从 sqlite3 计算磁盘使用量?除了数据库文件大小,这里还需要计算什么?

  2. 达到 2M 时会发生什么?我可以检查任何特定信息或错误以删除最旧的条目吗?

  3. 删除条目然后插入新条目是否是一种好方法(性能方面、数据分段方面)?

欢迎任何建议或反馈。

【问题讨论】:

    标签: database sqlite filesystems persistence


    【解决方案1】:

    无法计算磁盘使用量;您必须监视该文件。除了实际的数据库文件外,还有回滚日志,其大小对应于事务中更改的数据量。

    当磁盘已满时,您会收到错误代码 SQLITE_FULL(或者可能是 SQLITE_IOERR_WRITE,具体取决于操作系统)。

    您可以使用PRAGMA max_page_count 限制数据库大小。

    删除的行会导致该特定数据库页面中有更多可用空间。 (这永远不会改变文件大小,除非你运行VACUUM。) 在表的另一端插入新行时,只有在整个页面被释放时才能重新使用空间,因为它的所有行都被删除了。 因此,如果可能,您应该尝试大块删除行。

    【讨论】:

    • 谢谢.CL。我做了一个循环来多次插入和删除条目(每个都由 sqlite_exec 便利函数完成,超过 2M),我希望文件大小会增长。但是,它保持不变。如果空闲空间只被 VACCUM 收回,这有点矛盾。回滚日志文件在哪里?我只在目录中找到数据库文件。
    • 空闲空间可以被其他行重复使用; VACUUM 影响文件大小。使用默认setting,每次事务后都会删除回滚日志。
    • 是的,回滚日志只是临时文件。我现在明白了。我也尝试插入,例如2M 行,例如,大小为 82066432 字节的数据库文件,然后我删除所有这些行。文件大小不会缩小。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    相关资源
    最近更新 更多