1

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

过了一会儿,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);

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

4

1 回答 1

0

根据您的评论和 mmap 错误,我认为您遇到了与我仍在苦苦挣扎的问题类似的问题 - 过度使用统一缓冲区缓存。我猜这里发生的是 sqlite 正在使用 mmap 文件来备份其“内存中”数据库。所以它的 mmap 内存,它使用统一的缓冲区缓存(即共享内存池),并且可能根本不使用太多 malloc 内存(这就是为什么你看不到大数字的原因)。

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

使这个问题变得如此繁重的原因是,您在应用程序中几乎无法发现内存越来越少,因此您可以采取措施避免它。

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

在您的情况下,您可能会发现让 sqlite 基于文件更好,然后在继续之前保存并 F_FULLSYNC 文件(等待完成)。最后,我通过一个考虑高水位标记的串行调度队列来汇集我所有的图像工作。

于 2012-07-22T14:33:38.447 回答