CoreData多对多关系的缓慢插入



我有两个模型,它们之间有多对多关系。模型A在一个空状态下启动,而模型B有大约22万个记录(具有相当大的容量)大索引,但这应该不会影响,因为这个模型永远不会更新)。

从A到>B的to-many如下:

  • optional => false
  • transient => false
  • indexed => true
  • ordered => true
  • minCount => 0
  • maxCount => NSIntegerMax
  • deleteRule => NSCascadeDeleteRule

B->A的to-many如下:

  • optional => true
  • transient => false
  • indexed => false
  • ordered => false
  • minCount => 0
  • maxCount => NSIntegerMax
  • deleteRule => NSNullifyDeleteRule

当然,每个关系都是互为倒数的。我的问题是在创建新实体a之前,应用程序执行a取回请求获取实体b的2k条记录,然后,应用设置将这些记录发送到将要创建的实体A,然后保存上下文。问题是将2k条记录的nsorderedset设置为实体A实例在安装了iOS 6.0.1的iPhone 4S上多花了4秒,然后保存在同一设备中,上下文多花了4秒。这使得8秒创建模型a的新实例

我已经尝试启用/禁用模型A中的索引关联属性,但是这没什么区别。我正在努力完成的任务太繁重了实现吗?

在进行一些测试时,我观察到大多数时间都没有设置nsorderedset到实体A实例是因为反向关系。我做了一个快速测试,将多对多关系更改为多对多关系与目标模型成反比,则插入时间降为一半的时间。当然,这打破了多对多关系。只是一个快速测试。

我错过了什么吗?由于应用程序只保存了一次上下文,而不是每条记录一次B,保存2k不应该花那么长时间但我是iPhone开发的新手,也许我正在执行的这个任务对这种设备来说太贵了。

任何提示将非常感激。谢谢!

Ferdev,

谢谢你的问题写得好。很明显,在寻求帮助之前,你已经仔细考虑过你的问题。这对每个人都有帮助。

Core Data在保存时似乎没有使用块操作。因此,您将在那里遇到性能问题。关系的建立应该比你看到的要快。(顺便说一句,大多数性能问题都是由闪存的速度驱动的。它在iOS设备上很慢。因此,预取使MOC与数据保持同步非常重要。)

我做了一些观察:

为什么A->B对多关系既是索引的又是有序的?排序会减慢插入的速度。为关系建立索引也有意义吗?

您是否在使用批量关系设置器(-add<Key>:)?

您是否在将实体B的2000条记录设置为实体A实例之前获取它们?

即使这不会影响插入性能,为什么从A到>B的删除规则要级联呢?你上面写的实体B不变

安德鲁

最新更新