Объект базовых данных огромного размера - PullRequest
4 голосов
/ 26 марта 2012

Я пытался добавить 200 тыс. Сообщений в основной объект данных для подтверждения концепции приложения в твиттере. Это работает хорошо, и мои объекты добавляются. У меня есть UISearchBar и UITableView для их отображения. Однако, для каждого нового 1000 объектов мое время, кажется, увеличивается в геометрической прогрессии. Это нормально ? Я ожидал, что CoreData будет хорошо работать для огромных наборов данных. У вас есть лучшее предложение для обработки такого огромного набора данных. Интересно, как Dictionary apps работает.

Мой вывод на консоль находится здесь:

-2012-03-26 22: 19: 28.126 TweetReader [3668: 707] Готово 1000
-2012-03-26 22: 19: 40.335 TweetReader [3668: 707] Выполнено 2000
-2012-03-26 22: 19: 55.136 TweetReader [3668: 707] Готово 3000
-2012-03-26 22: 20: 18.569 TweetReader [3668: 707] Готово 4000
-2012-03-26 22: 20: 50.166 TweetReader [3668: 707] Выполнено 5000
-2012-03-26 22: 21: 30.284 TweetReader [3668: 707] Готово 6000
-2012-03-26 22: 22: 19.096 TweetReader [3668: 707] Выполнено 7000
-2012-03-26 22: 23: 16,091 TweetReader [3668: 707] Выполнено 8000
-2012-03-26 22: 24: 21.321 TweetReader [3668: 707] Выполнено 9000
-2012-03-26 22: 25: 35.017 TweetReader [3668: 707] Выполнено 10000
-2012-03-26 22: 26: 57.250 TweetReader [3668: 707] Готово 11000
-2012-03-26 22: 28: 27,563 TweetReader [3668: 707] Готово 12000
-2012-03-26 22: 30: 06.202 TweetReader [3668: 707] Готово 13000
-2012-03-26 22: 31: 52.645 TweetReader [3668: 707] Выполнено 14000

Вот мой код для сохранения в CoreData:

for (NSInteger i = 1; i <= 200000; i++) {

NSAutoreleasePool * myPool = [[NSAutoreleasePool alloc] init];

Tweet *tweetie = [NSEntityDescription insertNewObjectForEntityForName:@"Tweet" inManagedObjectContext:self.managedObjectContext];
    tweetie.name = [NSString stringWithFormat:@"%10d",i];
    tweetie.message =[NSString stringWithFormat:@"%10d",i];
    // Save the context after 1000 objects.
    if (! (i % 1000)) {
        NSError *error;
        NSLog(@"Done %d",i); 
        if (![managedObjectContext save:&error]) {
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        }

        [myPool release];
    }
}

Ответы [ 2 ]

3 голосов
/ 24 августа 2013

эй, если у вас есть 200 тыс. Сообщений, сначала найдите, какое хранилище оптимально для длины каждого вашего сообщения.Это будет методом проб и ошибок, я считаю, что 3000 является оптимальным.выполнить [сохранить контекст] для каждых 3000, например:

      for(i=0; i<num of objects;i++)
      { // form the object to be saved in context

      if(i%3000==0){ // save the num of records , optimum value
        NSError *error;
        NSLog(@"saved rec nu %d",i);
        if (![context save:&error]) {
            NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
            return NO;
       }

        [context processPendingChanges];// most important thing , if not objects will 
              // keep adding in context and time would for insertion would drastically increase.
     }
        //for last set of the objects which are less than 3000
        NSError *error;
        NSLog(@"saved rec nu %d",i);
        if (![context save:&error]) {
            NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
            return NO;



    }

Дайте мне знать, если что-нибудь ..

1 голос
/ 26 марта 2012

Какие столбцы вы проиндексировали в своей базе данных? Вы пытались заблокировать контекст во время добавления, чтобы увидеть, может ли он оптимизировать это (то есть вставки транзакционно?)

Основные данные, как известно, плохо при массовых вставках. Решением этой проблемы может быть просто использование sqlite напрямую - см. Эту статью для реального примера из жизни того, кто должен был это сделать: http://inessential.com/2010/02/26/on_switching_away_from_core_data

...