2016-07-25 67 views
0

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

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

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

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

  3. 这是一个很好的方法(性能明智,数据分割明智)删除条目,然后插入新的?

欢迎任何建议或反馈。

回答

1

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

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

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

删除的行导致该特定数据库页面中的可用空间更多。 (除非运行VACUUM,否则这绝不会改变文件大小。) 在表的另一端插入新行时,只有当整个页面因其所有行被删除而被释放时,该空间才能被重用。 所以你应该尝试删除大块中的行,如果可能的话。

+0

thanks.CL。我做了一个循环来多次插入和删除条目(每个都通过2M以上的sqlite_exec便利功能完成),我预计文件的大小会增加。但是,它仍然是一样的。如果可用空间仅由VACCUM收回,这有点矛盾。还有回滚日志文件在哪里?我只能在目录中找到数据库文件。 – pepero

+0

可用空间*可以被其他行重用; VACUUM影响文件大小。使用默认[设置](http://www.sqlite.org/pragma.html#pragma_journal_mode),回滚日志在每次事务之后被删除。 –

+0

是的,回滚日志只是临时文件。我现在明白了。我也尝试插入,例如2M行,这会导致例如82066432字节数据库文件的大小,然后我删除所有这些行。文件大小不缩小。 – pepero