为什么Core Data插入需要更长时间?

时间:2012-05-18 15:34:55

标签: iphone core-data ios5

在我的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

所以,结论是,这是我的获取请求,随着越来越多的文档需要越来越长的时间......但这也是有道理的:)不知道我为什么这么做的想法那个早些时候......所以现在解决方案是检查同步是否是第一个,然后导入文件而不对任何现有文档进行提取。

/雅各布

1 个答案:

答案 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

特别要阅读“有效实施查找或创建”。遵循他们的指导原则,您可以将数据库读取限制为每批记录一次,或者只对您导入的整个数据集限制一次。