Estoy tratando de importar una gran cantidad de datos en un almacén de datos central en el iPhone. Estoy usando un respaldo SQLite para el almacén de datos central. Parece que lleva más tiempo de lo que esperaría. Recorté las rutinas para que, básicamente, solo intente buscar un objeto (para ver si ya existe) y luego crear un nuevo objeto si no lo hace (nunca lo hacen porque estoy importando datos). Sin embargo, la búsqueda no es la parte que consume mucho tiempo. Es la creación de los objetos. Básicamente, el código erróneo es:¿Cómo puedo mejorar el rendimiento de la inserción de objetos de Core Data en iPhone?
MobileObject *newObject = (MobileObject *)[NSEntityDescription insertNewObjectForEntityForName:objDesc inManagedObjectContext:managedObjectContext];
me he dado cuenta de que en el simulador, es bastante rápido en el inicio con cerca de 100 objetos creados un segundo. Sin embargo, se ralentiza y para cuando se crean cinco mil objetos, son casi 2 segundos para 100 objetos y para cuando se crean diez mil objetos, son 4 segundos por cada 100 objetos. El grupo completo de 21000 objetos toma más de 10 minutos. Eso es con todo el código realmente útil eliminado (eso es solo una búsqueda y un objeto creado). Y es mucho más lento en el dispositivo real (tal vez 4 veces más).
Lo que no entiendo es por qué los datos del núcleo comienzan rápidamente pero luego comienzan a desacelerarse. He intentado tanto con índice como sin índices en mis datos. Intenté crear mi propio grupo de autorrelease, que periódicamente agoto en mi ciclo. Intenté guardar después de cada creación de objeto. Intenté esperar hasta el final para guardar. Pero no importa lo que haga, el rendimiento aún parece miserable. ¿Es tan lento agregar un nuevo objeto a un almacén de datos central con algunos miles de objetos en él? ¿Alguna sugerencia?
Debo comentar que en realidad creo que las capturas son las que ocupan una cantidad significativa de tiempo. Supongo que tiene sentido ya que a medida que la tienda se hace más grande, hay más objetos para buscar. – Mike
Como un lado, el molde en su código de ejemplo anterior es innecesario. '-insertNewObjectForEntity ...' devuelve un 'id' y, por lo tanto, no se debe ni se debe convertir. –
Crear una gran base de datos de esta manera puede ser increíblemente lento si espera hasta el final para guardar. Generalmente guardo después de cada pocos miles de objetos nuevos, no he experimentado para encontrar la frecuencia óptima. –