在我的Core Data应用程序中插入2000条记录时,我正在使用性能。
数据作为一个大JSON文件从服务器下载,并解析为JSON字典,所有这一切都很好,并且传递字典的时间不算什么......
问题是我的数据库中的每个插入都需要更长时间?
在导入过程中,我保存每100个文档的上下文以保持内存不变,第一个文档需要0.005434ms才能保存,最后一个需要0.039297ms才能保存..
我在一个单独的线程中执行所有这些导入,其中一个全新的ManagedContext,其中undomanager设置为nil ..
这是贯穿字典中所有文档的循环
NSArray *docs = [docsData objectForKey:@"docs"];
for(NSDictionary *doc in docs){
if(counter++ % 100){
[context save:nil];
}
NSDate *start = [NSDate date];
[Document documentWithDictionary:doc lastModifiedDate:[NSDate date] inLevels:nil inManagedObjectContext:context];
NSDate *end = [NSDate date];
NSLog(@"time used pr doc = %f",[end timeIntervalSinceDate:start]);
}
[context save:nil];
以下是插入doc
的代码 NSFetchRequest *req = [NSFetchRequest fetchRequestWithEntityName:@"Document"];
req.predicate = [NSPredicate predicateWithFormat:@"id = %@", [data valueForKey:@"id"]];
NSArray *matches = [context executeFetchRequest:req error:&error];
if(matches){
if([matches count]){
document = [matches lastObject];
}else {
document = [NSEntityDescription insertNewObjectForEntityForName:@"Document" inManagedObjectContext:context];
}
}
有人可以解释为什么插入物需要更长更长的时间吗?
在模拟器中,使用的时间pr doc几乎不变,但在手机上它不是?
这可能是一个小问题,但由于我可以在数据库中拥有2000到30000条记录,这实际上成为大量导入的一个因素。
非常感谢:)
/雅各布
更新-----
在数据库中进行ONLY插入后,即没有现有记录的提取,这些都是时间..
WITH Fetch:
1100 docs - 54.6s
2349 docs - 194.9s
1872 docs - 222.1s
没有抓取。
1100 docs - 34.4s
2349 docs - 74.19s
1872 docs - 59.1s
所以,结论是,这是我的获取请求,随着越来越多的文档需要越来越长的时间......但这也是有道理的:)不知道我为什么这么做的想法那个早些时候......所以现在解决方案是检查同步是否是第一个,然后导入文件而不对任何现有文档进行提取。
/雅各布
答案 0 :(得分:0)
根据您的代码,该问题与插入任何内容无关。在调用save方法之前,实际上没有任何内容持久存储到数据库中。我假设“...插入文档的代码”是documentsWithDictionary中的代码:lastModifiedDate:inLevels:inManagedObjectContext:method。您实际上并未在此处插入任何内容,而是在内存中创建新的ManagedObject。但是,每次执行此操作时都要查询数据库。随着数据库中记录数量的增加,查询可能需要稍长时间才能找到给定id的记录。
Apple概述了一些有效导入大型数据集的良好做法:http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/coredata/Articles/cdImporting.html#//apple_ref/doc/uid/TP40003174-SW1
特别要阅读“有效实施查找或创建”。遵循他们的指导原则,您可以将数据库读取限制为每批记录一次,或者只对您导入的整个数据集限制一次。