2017-01-31 8 views
0

私は、起動時(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番目のエントリだけが保存され、パフォーマンスが高速になります。しかし、このように、それは非常に遅いです、なぜ私は不思議ですか?私は別のスレッドでインポートコンテキストを持っていますが、まだそれはずっと遅れています...

+1

は、それが常に同じCSVファイルのですか?最初の永続ストアをアプリケーションの中に置き、最初の起動時に適切な場所にコピーします。 – Willeke

答えて

0

通常、すべてのエントリを処理した後で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); 
} 
関連する問題