【发布时间】:2012-05-11 05:35:21
【问题描述】:
我正在解析最初插入核心数据存储的大量数据。
稍后,我将解析相同的 XML,尽管其中一些可能已更新。然后我要做的是检查具有相同标签的现有记录,如果已经存在,我用数据更新记录。
但是,虽然我的初始解析(大约 11.000 条记录)需要 8 秒左右,但更新似乎很昂贵并且需要 144 秒(这些是模拟器运行,因此在实际设备上要长得多)。
虽然第一次很好(我正在显示一个进度条),但第二次却长得令人无法接受,我想做一些事情来提高速度(即使它发生在单独线程的后台)。
不幸的是,这不是 find-or-create 的问题,因为 XML 中的数据可能已针对个别记录发生了变化,因此每个记录都可能需要更新。
我已经对属性进行了索引,这也加快了初始解析和更新的速度,但它仍然很慢(上面的数字带有索引)。我注意到解析/更新似乎逐渐减慢。虽然最初很快,但随着处理的记录越来越多,它变得越来越慢。
所以最后我的问题是,对于我如何提高更新数据集的速度有什么建议吗?我正在使用 MagicalRecord 来获取记录。代码如下:
Record *record;
if (!isUpdate) {
record = [NSEntityDescription insertNewObjectForEntityForName:@"Record" inManagedObjectContext:backgroundContext];
} else {
NSPredicate *recordPredicate = [NSPredicate predicateWithFormat:@"SELF.tag == %@", [[node attributeForName:@"tag"] stringValue]];
record = [Record findFirstWithPredicate:recordPredicate];
}
【问题讨论】:
-
您多久在 Context 上调用一次保存?
-
我总共调用了 18 次。我玩过这个数字,它似乎是整体速度的神奇数字。
-
如果我没看错的话,当你第一次插入这些记录时,总共只需要大约 8 秒。那么认为如果您删除现有实体然后插入一个包含更新数据的新实体会更快,这是否天真?
-
这可能会加快速度,但是当数据突然不存在时,我会冒着用户尝试访问数据的风险。
-
首先,使用“Time Profiler”仪器运行仪器更新。
标签: ios core-data nsfetchrequest