0

我有两个模型,它们之间存在多对多关系。模型 A 以空状态开始,而模型 B 有大约 220k 条记录(索引相当大,但这不应该影响,因为这个模型永远不会更新)。

从 A->B 的对多如下:

  • 可选 => 假
  • 瞬态 => 假
  • 索引 => 真
  • 有序 => 真
  • minCount => 0
  • maxCount => NSIntegerMax
  • deleteRule => NSCascadeDeleteRule

B->A 的一对多如下:

  • 可选 => 真
  • 瞬态 => 假
  • 索引 => 假
  • 有序 => 假
  • minCount => 0
  • maxCount => NSIntegerMax
  • deleteRule => NSNullifyDeleteRule

当然,每个关系都被设置为另一个关系。我面临的问题如下:在创建新实体 A 之前,应用程序执行一个获取请求,该请求获取实体 B 的大约 2k 条记录。然后,应用程序将这些记录设置为即将创建的实体 A,然后保存上下文。问题是将 2k 条记录的 nsorderedset 设置为实体 A 实例在装有 iOS 6.0.1 的 iPhone 4S 中或多或少需要 4 秒,而在同一设备中保存上下文又或多或少需要 4 秒。这使得创建模型 A 的新实例需要 8 秒。

我已经尝试启用/禁用模型 A 中的索引关联属性,但这并没有产生如此大的差异。我要完成的任务有那么重吗?

进行了一些测试,我观察到大部分时间都因为反向关系而丢失了将 nsorderedset 设置为实体 A 实例。我做了一个快速测试,将目标模型中的多对多关系更改为无反比关系的多对多,然后插入时间减少到一半。当然,这打破了多对多的关系。这只是一个快速测试。

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

任何提示将不胜感激。谢谢!

4

1 回答 1

0

费尔德夫,

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

Core Data 在保存时似乎不使用块操作。因此,您将在那里遇到性能问题。虽然关系设置应该比您看到的要快。(顺便说一句,大多数性能问题是由闪存的速度驱动的。在 iOS 设备上速度很慢。因此,预取以使您的 MOC 保持数据热很重要. 批量获取很重要。)

我提出几点意见:

为什么 A->B 对多关系既是索引又是有序的?订购会减慢您的插入速度。索引关系是否也有意义?

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

Are you fetching all 2000 of your entity B records before you set them to the entity A instance?

Even though this doesn't affect your insert performance, why does the delete rule from A->B cascade? You write above entity B doesn't change.

Andrew

于 2012-12-27T13:23:29.850 回答