如何使用C API测量内存中的SQLite数据库大小?

时间:2012-07-22 12:27:14

标签: ios database sqlite size c-api

我正在iOS中对内存中的SQLite数据库进行压力测试。

在一段时间后,OCUnit解决了这个错误。

otest(79450,0xad21a2c0) malloc: *** mmap(size=40267776) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug

我认为这会达到内存限制。但我无法弄清楚我目前的数据库大小。我试过了,

sqlite3_status(SQLITE_STATUS_MEMORY_USED, &current, &peak, false);

但这总是会为0返回current,而peak的某些值会在更新时返回相同的值。我读了manual entry,但它看起来不像db size功能。我想我正在挖错地方。如何使用C-API获取数据库大小?

1 个答案:

答案 0 :(得分:0)

根据您的评论和mmap错误,我认为您遇到的问题与我仍在努力解决的问题有关 - 使用统一缓冲区缓存。我猜测的是,sqlite正在使用mmap文件来备份其“内存”数据库。所以它的mmap内存使用统一缓冲区缓存(即共享内存池),并且可能根本不使用大量的malloc内存(这就是为什么你看不到大数字的原因)。

现在,随着ubc缓存变得越来越“脏”,iOS开始被剥夺了可以在任何实例使用的内存。所以,在某个时候,sqlite试图mmap更多的内存,但当系统寻找免费的ubc页面时,没有任何免费的。将块刷新到闪存文件系统需要很长时间。

这是一个如此棘手的问题是因为你的应用程序几乎无法发现内存不足,所以你可以采取措施避免它。

我在“显示大量下载的图像”开源项目中所做的是跟踪我的ubc使用情况,并且从不让它超过系统总内存的50%。

在你的情况下,你可能会发现让sqlite基于文件更好,然后在继续之前保存和F_FULLSYNC文件(等待完成)。最后,我通过一个连续的调度队列汇集了我所有的图像工作,该队列记录了高水位线。