mi aplicación de iPhone tiene una entidad Words
con los atributos word
, length
y language
. Ambos están indexados: Simple Core Data fetch es muy lento
Copié el modelo de cdata y la base de datos a una aplicación importadora separada donde se prellena con aproximadamente 400k palabras en diferentes idiomas. Verifiqué la importación buscando en el archivo SQLite y luego copié la base de datos precargada al proyecto de iPhone.
Primero pensé que el predicado (simple) es el problema. Pero incluso después de eliminar el predicado de la solicitud de búsqueda, se necesita mucho tiempo para su ejecución:
2011-09-01 09:26:38.945 MyApp[3474:3c07] Start
2011-09-01 09:26:58.120 MyApp[3474:3c07] End
Esto es lo que se ve mi código como:
// 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;
es el número de entradas en la base de datos un problema para Core Data?
EDITAR: Como gcbrueckmann y jrturton señalaron, es un buen punto para establecer fetchBatchSize
. Pero el tiempo ha podido recuperar sigue siendo insatisfactoria:
2 segundos con un conjunto de predicados:
NSPredicate * predicado = [NSPredicate predicateWithFormat: @ "== longitud% d e Idioma BEGINSWITH% @", longitud de palabra, lng ]; [fetchRequest setPredicate: predicate];
7 segundos con el conjunto de tamaño de lote:
[fetchRequest setFetchBatchSize: 1];
1 segundo con un tanto el predicado y el tamaño del lote establecido
¿Existe todavía otro cuello de botella?
en su predicado es el lenguaje, posiblemente, más restrictiva que la longitud, a veces el orden de los controles subyacentes pueden acelerar las cosas así. por ejemplo, en este caso, si el 60% de las palabras cumplieron con los criterios de su longitud, pero solo el 40% cumplía con los criterios de idioma, sería mejor que primero se hiciera la verificación del idioma. La otra cosa podría ser si necesita esto más rápido sería tenerlo precargado y luego filtrar una matriz en la memoria no estoy seguro si su aplicación de iPhone puede manejar eso sin embargo. –
En este caso, la primera consulta compara números enteros (la indexación lo hará muy rápido) y la segunda es una comparación de cadenas (incluso una cadena indexada no va a ser rápida) - Me sorprendería si ayudara a reordenar la consulta. Sin embargo, pruébalo, ¡me interesaría ver si me ayudó! – deanWombourne
Ah, se me olvidó mencionarlo: ya he intentado cambiar el orden del predicado, no acelera la búsqueda. – Norbert