【问题标题】:iphone Core Data - Why Core data is so slow?iphone Core Data - 为什么Core data 这么慢?
【发布时间】:2011-08-22 09:02:17
【问题描述】:

我在 CoreData 中的表有 8 列,都是字符串。最大字符串长度小于10K。

首先,我使用以下代码检索行:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Item" inManagedObjectContext:context]];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"(URL ==[c] %@)", url]];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Time" ascending:NO selector:nil];
NSArray *descriptors = [NSArray arrayWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:descriptors];
[sortDescriptor release];

NSError *error = nil;
NSArray *array = [context executeFetchRequest:fetchRequest error:&error];

这是性能日志:

2011-05-10 11:47:18.743 Test2[2176:5907] CoreData:注释:sql 连接获取时间:2.6172s

2011-05-10 11:47:21.600 Test2[2176:5907] CoreData:注释:总提取执行时间:144 行 2.8577 秒。

144 行超过 2 秒?

然后我为每一行构造一个非coredata对象:

if ([array count] > 0) {
    for (Item *item in array) {
        SimpleItem *sitem = [[SimpleItem alloc] init];
        sitem.Title = item.Title;
        sitem.Summary = item.Summary;
        sitem.URL = item.URL;
        [dataDict setObject:sitem forKey:item.URL];
        [sitem release];
    }
    [dataDict release];
}

上述代码的部分性能日志(我认为是一行读取)是:

2011-05-10 11:47:21.617 Test2[2176:5907] CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZURL, t0.ZSUMMARY, , t0.ZIMAGEURL, t0.ZTITLE , t0.ZURL, t0.ZTIME 从 ZITEM t0 WHERE t0.Z_PK = ?

2011-05-10 11:47:21.629 Test2[2176:5907] CoreData:注解:sql连接获取时间:0.0098s

2011-05-10 11:47:21.633 Test2[2176:5907] CoreData:注释:总提取执行时间:1 行 0.0162 秒。

好像有问题。

谁能帮我提高性能?

另外,当我在 xcode 中编辑数据模型时,我已经检查了 URL 的“索引”选项。这足以建立索引吗?

【问题讨论】:

  • 需要更多细节才能提供任何有用的答案。
  • @Denis,是的,我更新了我的问题

标签: iphone core-data


【解决方案1】:

听起来您没有在列上使用任何索引,这可能有助于加快速度,但如果您要搜索长度为 10K 的字符串,CoreData 可能不适合。

CoreData 不是数据库——它处理一些事情的效率比使用 sqlite 低。在 CoreData 中,对象完全加载到内存中以进行某些操作 - 将 10K * 144 条记录加载到内存中可能不会是世界上最快的事情:)

尝试用 sqlite 编写数据库代码,看看是否更快。

【讨论】:

  • 您好。我认为就我而言,CoreData 没有一次将 144 行内容加载到内存中。相反,只有当我读取一行的每个属性时,才会将内容加载到内存中。我用完整的日志更新我的问题。顺便问一下,如何设置索引?谢谢
  • 如果您选择一个属性(在本例中为 URL),则 XCode 的属性检查器视图中应该有一个标记为“已索引”的复选框。
  • 您还可以查看developer.apple.com/library/ios/#documentation/CoreData/… - NSFetchedResultsController 将批量获取结果,而不是一次获取所有结果。
  • 是的,在这种情况下,我已经建立了索引。你能再看看我的问题吗,我更新了更多细节。我认为 CoreData 在将行检索到数组中时会使用错误,只有当我读取该数组中的每个 NSManagedObject 时,内容才会被完整归档。我说的对吗?
  • 应该是这样,是的。如果您将NSLog(@"%@", item); 作为循环的第一行,您会得到什么输出 - 这应该会告诉您item 的数据是错误还是已经加载。
猜你喜欢
  • 1970-01-01
  • 2015-10-15
  • 2011-05-26
  • 2011-02-16
  • 2010-12-07
  • 2020-09-06
  • 2021-06-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多