mon application iPhone a une entité Words
avec les attributs word
, length
et language
. Les deux sont indexés: Simple Core Data fetch est très lent
J'ai copié le cdatamodel et la base de données dans une application d'importateur séparée où il a été pré-rempli avec environ 400k mots dans différentes langues. J'ai vérifié l'importation en examinant le fichier SQLite, puis j'ai copié la base de données préremplie dans le projet iPhone.
D'abord je pensais que le prédicat (simple) était le problème. Mais même après avoir supprimé le prédicat de la demande de récupération, il faut un temps très long pour l'exécution:
2011-09-01 09:26:38.945 MyApp[3474:3c07] Start
2011-09-01 09:26:58.120 MyApp[3474:3c07] End
Voici ce que mon code ressemble:
// 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;
Le nombre d'entrées dans la base de données un problème pour les données de base?
EDIT: Comme gcbrueckmann et jrturton ont fait remarquer, il est un bon point de mettre fetchBatchSize
. Mais le temps chercher est encore peu satisfaisante:
2 secondes avec un ensemble de prédicats:
NSPredicate * prédicat = [NSPredicate predicateWithFormat: @ "longueur ==% d et la langue BEGINSWITH% @", longueur de mot, lng ] [fetchRequest setPredicate: predicate];
7 secondes avec l'ensemble de la taille du lot:
[fetchRequest setFetchBatchSize: 1];
1 seconde avec une fois le prédicat et la taille des lots mis
Est-il encore un autre goulot d'étranglement?
dans votre prédicat est la langue peut-être plus restrictive que la longueur, parfois l'ordre des contrôles sous-jacentes peuvent accélérer les choses aussi bien. par exemple dans ce cas si 60% des mots répondaient à vos critères de longueur mais que seulement 40% répondaient aux critères de langue, il serait préférable d'avoir la vérification de la langue en premier. L'autre chose pourrait être si vous avez besoin de cela plus rapidement serait de l'avoir pré-chargé, puis filtrer un tableau en mémoire pas sûr si votre application iphone peut gérer cela si. –
Dans ce cas, la première requête compare des entiers (l'indexation rendra cela très rapide) et la seconde est une comparaison de chaînes (même une chaîne indexée ne sera pas rapide) - Je serais surpris si le réordonnancement de la requête aidait. Cependant, essayez-le - je serais intéressé de voir si cela a aidé! – deanWombourne
Oh, j'ai oublié de le mentionner: j'ai déjà essayé d'échanger l'ordre du prédicat, ça n'accélère pas le fetch. – Norbert