私は、起動時(50,000エントリ)のCSVファイルのデータをアプリケーションのデータベースに書きたいと思っています。私はしかし、パフォーマンスの問題に遭遇する...それは今は遅すぎるとシミュレータで2-3分かかる。次のように私のコンテキスト階層は次のとおりです。Coredata:たくさんのデータを保存するときのパフォーマンスの問題
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を指定すると、もちろん、すべての2000番目のエントリだけが保存され、パフォーマンスが高速になります。しかし、このように、それは非常に遅いです、なぜ私は不思議ですか?私は別のスレッドでインポートコンテキストを持っていますが、まだそれはずっと遅れています...
は、それが常に同じCSVファイルのですか?最初の永続ストアをアプリケーションの中に置き、最初の起動時に適切な場所にコピーします。 – Willeke