7

我正在解析最初插入核心数据存储的大量数据。

稍后,我将解析相同的 XML,尽管其中一些可能已更新。然后我要做的是检查具有相同标签的现有记录,如果已经存在,我用数据更新记录。

然而,虽然我的初始解析(大约 11.000 条记录)需要 8 秒左右,但更新似乎很昂贵并且需要 144 秒(这些是模拟器运行,因此在实际设备上要长得多)。

虽然第一次很好(我正在显示一个进度条),但第二次太长了,我想做一些事情来提高速度(即使它发生在单独线程的后台)。

不幸的是,这不是查找或创建的问题,因为 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];
}
4

4 回答 4

3

与其进行大量的提取,不如对每种实体类型进行一次查询,然后按标签将它们存储在字典中,然后只需检查字典是否存在具有该键的对象。您应该能够将 propertiesToFetch 设置为仅包含标记,并且应该可以减少开销。

于 2012-05-01T19:08:55.570 回答
1

所有性能问题的最初答案是运行仪器。然后,使用这些数据,您可以确定您的问题区域。从那里,您可能对提高性能的某些方面有其他具体的问题。

我们人类在识别性能瓶颈方面是出了名的差。所以,首先使用仪器。它肯定会告诉你你的时间都花在了哪里。

于 2012-05-02T12:51:55.830 回答
1

您还可以尝试将高级的答案与属性的散列结合起来。

在插入散列属性并将该散列存储为Record.
在更新时,您将获取的属性设置为标记和校验和,并对所有项目进行一次获取。然后,当您遍历数据集时,如果校验和与已获取的不同,您可以获取Record并更新它。

于 2012-05-01T19:45:00.420 回答
1

您可以尝试的一件事是使用模板 NSPredicate,这样您就不会为正在执行的每个查找/获取重新解析格式字符串。

所以在你进入你的循环之前:

NSPredicate *template = [NSPredicate predicateWithFormat:@"SELF.tag == $RECORD_TAG"];

循环内:

Record *record;
if (!isUpdate) {
    record = [NSEntityDescription insertNewObjectForEntityForName:@"Record" inManagedObjectContext:backgroundContext];
} else {
    NSPredicate *recordPredicate = [];
    record = [Record findFirstWithPredicate:[template predicateWithSubstitutionVariables:[NSDictionary dictionaryWithObject:[[node attributeForName:@"tag"] stringValue] forKey:@"RECORD_TAG"]];
}

有关更多信息,请参阅 Apple 的谓词编程指南

于 2012-05-01T18:19:54.213 回答