Core Data iPhone 在插入 50k 记录时,我应该多久调用一次 [managedObjectContext save:&error]?

Posted

技术标签:

【中文标题】Core Data iPhone 在插入 50k 记录时,我应该多久调用一次 [managedObjectContext save:&error]?【英文标题】:Core Data iPhone how often should I call [managedObjectContext save:&error] when doing 50k record insert? 【发布时间】:2010-04-19 01:20:23 【问题描述】:

我将偶尔从 XML 导入核心数据。我将添加大约 50k 个实体。我的问题是我应该多久调用一次 [managedObjectContext save:&error]。对于添加的每个新实体,或每 x 个实体,还是仅在 50k 导入结束时?

我目前正在为每个实体调用它,并尝试仅在每 10k 左右执行一次,并且导入速度急剧上升,但在前 30k 之后它会崩溃:

*** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <NSCFSet: 0x13e760> was mutated while being enumerated.'

在我花太多时间尝试诊断那里发生了什么之前,我想我应该检查一下是否可以不对每个实体调用保存?

调用 save 之前的实体数量是否受到这些实体使用的内存量的限制?

【问题讨论】:

那么,你搞清楚了吗?我的情况是每秒有100+条消息一条一条地给我,如何处理以降低cpu成本? 【参考方案1】:

不要保存每个实体,这是浪费和低效的。最佳位置取决于您的数据,但绝对大于每个条目且小于 50K :)

我建议从每 1k 开始,并在您进一步进入应用程序开发时从那里进行调整。

至于您看到的那个错误,它与保存数据几乎没有关系。您在迭代可变数组时正在删除或添加对象。出于明显的原因,这是不允许的。

【讨论】:

该错误可能与从两个不同的线程访问 ManagedObjectContext 有关。如果记录数较少,并不总是会发生这种情况,但随着托管对象数量的增加,这种可能性会增加。

以上是关于Core Data iPhone 在插入 50k 记录时,我应该多久调用一次 [managedObjectContext save:&error]?的主要内容,如果未能解决你的问题,请参考以下文章

iPhone:为啥 Core Data 中的 Bulk Inserts 这么慢?

Core Data 无法删除从未插入的对象错误

在 Iphone 中使用 Core Data 从 SQLite 数据库中获取主键值

iPhone在Core Data中保存多个对象?

iPhone Core Data 关系故障

Core Data iphone调试指针