【发布时间】: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