Moja aplikacja na telefon iPhone ma jednostkę Words
o atrybutach word
, length
i language
. Oba są indeksowane: Pobieranie prostych danych rdzenia jest bardzo powolne.
Skopiowałem cdatamodel i bazę danych do oddzielnej aplikacji importera, w której wstępnie wypełniono około 400 000 słów w różnych językach. Sprawdziłem import, zaglądając do pliku SQLite, a następnie skopiowałem wstępnie wypełnioną bazę danych do projektu iPhone'a.
Najpierw myślałem, że (prosty) predykat jest problemem. Ale nawet po usunięciu orzecznik z żądania zwrcania, trwa bardzo długo do wykonania:
2011-09-01 09:26:38.945 MyApp[3474:3c07] Start
2011-09-01 09:26:58.120 MyApp[3474:3c07] End
Oto co mój kod wygląda następująco:
// 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;
Czy liczba wpisów w bazie danych problem z Core Data?
EDIT: Jak gcbrueckmann i jrturton wskazał, że to dobry punkt, aby ustawić fetchBatchSize
. Ale sprowadzić czas nadal jest niezadowalająca:
2 sekundy z kompletem kwantyfikatorów:
NSPredicate * orzecznik = [NSPredicate predicateWithFormat: @ "długość ==% D i język BEGINSWITH% @", długość słowa, LNG ]; [fetchRequest setPredicate: predicate];
7 sekund stosując zestaw wielkość wsadu
[fetchRequest setFetchBatchSize: 1];
1 drugim miejscu z obu orzecznika i wielkości partii ustawić
Czy istnieje jeszcze inna gardłem?
w orzecznika jest językiem prawdopodobnie bardziej restrykcyjne niż długość, czasami kolejność kontroli źródłowych można przyspieszyć, jak również. na przykład w tym przypadku, jeśli 60% słów spełnia kryteria długości, ale tylko 40% spełnia kryteria językowe, lepiej najpierw sprawdzić język. Inną rzeczą może być, jeśli potrzebujesz tego szybciej byłoby mieć to wstępnie załadowane, a następnie filtr tablicy w pamięci, nie wiesz, czy twoja aplikacja iPhone może sobie z tym poradzić. –
W tym przypadku pierwsze zapytanie porównuje liczby całkowite (indeksowanie spowoduje to bardzo szybko), a drugie jest porównaniem ciągów znaków (nawet indeksowany ciąg nie będzie szybki) - Byłbym zaskoczony, gdyby zmiana kolejności pomogła w ponownym uporządkowaniu zapytania. Jednak spróbuj - chciałbym zobaczyć, czy to pomogło! – deanWombourne
Och, zapomniałem o tym wspomnieć: już próbowałem zamienić rozkaz predykatu, nie przyspiesza to pobierania. – Norbert