Простой сбор данных ядра очень медленный

мое приложение для iPhone имеет сущность Words с атрибутами word, length и language. Оба проиндексированы: Entity and attributes

Я скопировал кдатамодель и базу данных в отдельное приложение импортера, где он был предварительно заполнен примерно 400k слов на разных языках. Я проверил импорт, просмотрев файл SQLite, а затем скопировал предварительно заполненную базу данных обратно в проект для iPhone.

Сначала я подумал, что (простой) предикат - это проблема. Но даже после удаления предиката из запроса на получение, на его выполнение требуется очень много времени:

2011-09-01 09:26:38.945 MyApp[3474:3c07] Start
2011-09-01 09:26:58.120 MyApp[3474:3c07] End

Вот как выглядит мой код:

// Get word
NSLog(@"Start");
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Words" inManagedObjectContext:appDelegate.managedObjectContext];
[fetchRequest setEntity:entity];

NSError *error = nil;
NSArray *fetchedObjects = [appDelegate.managedObjectContext executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
    //... error handling code
}

[fetchRequest release];
NSLog(@"End");
return fetchedObjects;

Является ли количество записей в базе данных проблемой для Core Data?


EDIT: Как отметили gcbrueckmann и jrturton, хорошим моментом является установка fetchBatchSize. Но время извлечения все еще неудовлетворительно:

  • 2 секунды с набором предикатов:

    NSPredicate *predicate = [NSPredicate предикатWithFormat:@"length ==%d AND language BEGINSWITH %@", wordLength, lng]; [fetchRequest setPredicate:predicate];

  • 7 секунд при установленном размере партии:

    .

    [fetchRequest setFetchBatchSize:1];

  • 1 секунда с предикатом и набором размеров партии

Есть ли еще одно узкое место?

7
задан Norbert 1 September 2011 в 10:22
поделиться