【问题标题】:How do I improve performance of Core Data object insert on iPhone?如何提高 iPhone 上 Core Data 对象插入的性能?
【发布时间】:2012-12-30 03:53:05
【问题描述】:

我正在尝试将大量数据导入 iPhone 上的核心数据存储。我正在为核心数据存储使用 SQLite 支持。它似乎花费的时间比我预期的要长。我已经精简了例程,因此它基本上只是尝试获取一个对象(查看它是否已经存在),然后如果它不存在则创建一个新对象(因为我正在导入数据,它们从不这样做)。不过,获取并不是耗时的部分。这是对象的创建。基本上,有问题的代码是:

MobileObject *newObject = (MobileObject *)[NSEntityDescription insertNewObjectForEntityForName:objDesc inManagedObjectContext:managedObjectContext];

我注意到在模拟器上,一开始它相当快,每秒创建大约 100 个对象。虽然它变慢了,当创建 5000 个对象时,100 个对象几乎需要 2 秒,到创建 10000 个对象时,每 100 个对象需要 4 秒。整组 21000 个对象需要 10 多分钟。那就是取出所有实际有用的代码(这只是一个提取和一个对象创建)。而且在实际设备上速度要慢得多(可能是原来的 4 倍)。

我不明白为什么核心数据开始很快,然后开始变慢。我已经尝试过对我的数据使用索引和没有索引。我尝试创建自己的自动释放池,我会定期在循环中耗尽。我尝试在每次创建对象后保存。我试过等到最后保存。但无论我做什么,表现似乎仍然很糟糕。将一个新对象添加到包含几千个对象的核心数据存储中会那么慢吗?有什么建议吗?

【问题讨论】:

  • 我应该评论说,实际上我认为获取是那些占用大量时间的。我想这是有道理的,因为随着商店越来越大,要搜索的对象也越来越多。
  • 顺便说一句,上面示例代码中的强制转换是不必要的。 -insertNewObjectForEntity... 返回 id,因此不应该也不应该被强制转换。
  • 如果您等到最后保存,以这种方式创建一个巨大的数据库可能会非常慢。一般来说,我每隔几千个新对象就保存一次,没有尝试找到最佳频率。
  • 你还想回答这个问题吗?
  • @Mike 找到解决问题的方法。我也有完全一样的问题。我还尝试将 normalizedText 属性添加到我的模型对象中,这样可以提高搜索性能,但在导入 2000 个项目后仍然很慢...

标签: iphone performance core-data


【解决方案1】:

它可能非常快,但这取决于你在做什么。正如其他人建议的那样,您应该查看 Instruments 并找到实际的热点。同时发布实际的导入代码将有助于识别问题。

【讨论】:

  • 对我来说,我 am 使用 Instruments,它告诉我 _sharedIMPL_addObjectToSet_core 需要 99% 的时间 - 反过来, NSObject 的键值观察者需要 50%,而 _PF_ManagedObject_DidChangeValueForKeywithSetMutation 需要其他时间50%。我正在连接数千个“句子”实体之间的多对多关系——这些是彼此的翻译。即使在尝试了一些优化之后,缓慢的罪魁祸首实际上是关系“插入”,它可能在 CoreData 的幕后进行。我只是觉得如果使用直接 sqlite 至少会快 50% :-P
  • SQLite 比 Core Data 快。 Core Data 不会是最快的,它是最可维护的。至于 Instruments,隐藏系统库,展平递归并反转调用树。然后查看上面的 YOUR 代码。这就是你需要解决的问题。当您找到属于您的方法时,双击它,Instruments 将向您显示该方法内部的缓慢之处。
  • 这正是我所做的。我深入研究了我的函数,其中包含一个只有一个实体的几十万多对多关系的循环——是的,这些句子是彼此的翻译。我在想我用于源数据的中间 NSDictionaries 的索引速度很慢,我在那里做了一些优化,但 Instruments 清楚地表明问题不在于 NSDictionary,而在于内部插入操作。最终真正使用了sqlite。上次我尝试 Core Data 时,我也遇到了性能太慢的问题,只使用了 Sqlite。
  • 如果你在一个实体上建立了几十万个多对多关系,那么你就有了设计问题或预填充问题。由于 Core Data 是一个对象图而 SQLite 是一个数据库,SQLite 在持久化方面总是会更快。正如我之前所说,Core Data 的目的不是加快磁盘速度。错误的工具。
【解决方案2】:

尝试使用仪器。插入每个对象后不保存吗?实际上,更多与插入相关的代码和方案可能会非常有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多