мое приложение для iPhone имеет сущность Words
с атрибутами word
, length
и language
. Оба проиндексированы:
Я скопировал кдатамодель и базу данных в отдельное приложение импортера, где он был предварительно заполнен примерно 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 секунда с предикатом и набором размеров партии
Есть ли еще одно узкое место?