【问题标题】:Coredata: Performance issue when saving a lot of dataCoredata:保存大量数据时的性能问题
【发布时间】:2017-01-31 17:11:03
【问题描述】:

我想在初始启动期间使用 CSV 文件中的一些数据填充我的应用程序的数据库(50'000 个条目)。但是我遇到了性能问题......现在太慢了,在模拟器中需要 2-3 分钟。我的上下文层次结构如下:

parentContext(单独的线程) 上下文(主线程) importContext(单独线程)

代码:

for (NSString *row in rows){
            columns = [row componentsSeparatedByString:@";"];
            //Step 1
            Airport *newAirport = [Airport addAirportWithIcaoCode: [columns[0] stringByTrimmingCharactersInSet:
                                                                    [NSCharacterSet whitespaceCharacterSet]]
                                                             name:columns[1]
                                                         latitude:[columns[2] doubleValue]
                                                        longitude:[columns[3] doubleValue]
                                                        elevation:[columns[4] doubleValue]
                                                        continent:columns[5]
                                                          country:columns[6]
                                                      andIataCode:columns[7]
                                           inManagedObjectContext:self.cdh.importContext];
            rowCounter++;
            //Increment progress
            dispatch_async(dispatch_get_main_queue(), ^{
                [progress setProgress:rowCounter/totalRows animated:YES];
                [progress setNeedsDisplay];
            });

            // STEP 2: Save new objects to the parent context (context).
            //if(fmodf(rowCounter, batchSize)== 0) {
                NSError *error;
                if (![self.cdh.importContext save:&error]) {
                    NSLog(@"error saving %@", error);
                }
            //}

            // STEP 3: Turn objects into faults to save memory
            [self.cdh.importContext refreshObject:newAirport mergeChanges:NO];
        }

如果我在第 2 步中为批量大小为 2000 的模数激活 if,那么当然只有每 2000 个条目会被保存,然后性能会很快。但是像这样它超级慢,我想知道为什么?我在一个单独的线程中有我的导入上下文,但它仍然非常滞后......

【问题讨论】:

  • 是否总是同一个 CSV 文件?将初始持久性存储放在您的应用中,并在初始启动期间复制到合适的位置。

标签: objective-c multithreading core-data


【解决方案1】:

通常,在处理完所有条目后发出一个save 就足够了。你不需要经常保存它。只需在for 循环之后执行此操作。我看到您每次都尝试通过将对象转换为故障来节省内存,因此这可能需要save(之前没有尝试过)。

我建议你改用@autoreleasepool,让系统决定在哪里保存内存:

for (NSString *row in rows) {
    @autoreleasepool {
    // Just STEP 1 here
    ...
    }
}
NSError *error;
if (![self.cdh.importContext save:&error]) {
    NSLog(@"error saving %@", error);
}

【讨论】:

    猜你喜欢
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多