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



我正在为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);

但这总是为current返回0并且为peak返回某个值,所有这些都是相同的更新。我阅读了手动输入,但它看起来不像数据库大小功能。我想我挖错地方了。如何使用C-API获取数据库大小?

根据您的评论和mmap错误,我认为您遇到了与我仍在努力解决的问题类似的问题——过度使用统一缓冲区缓存。我猜测这里发生的事情是sqlite正在使用一个mmap文件来备份其"内存中"数据库。因此,它的mmap'd内存使用统一缓冲区缓存(即共享内存池),并且可能根本不使用太多malloc'd内存(这就是为什么你在那里看不到大数字的原因)。

现在,随着ubc缓存变得越来越"脏",iOS开始被剥夺在任何情况下都可以使用的内存。因此,在某个时候,sqlite会尝试mmap更多的内存,但当系统寻找可用的ubc页面时,却没有任何可用的页面。将块刷新到闪存文件系统需要很长时间。

这是一个如此繁重的问题,因为你在应用程序中几乎无法发现内存越来越低,所以你可以采取措施避免它

我在"显示巨大的下载图像"开源项目中所做的是对我的ubc使用情况进行sep跟踪,并且从未让它超过系统总内存的50%。

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

最新更新