Ich versuche, eine große Menge von Daten in einen Kerndatenspeicher auf dem iPhone zu importieren. Ich verwende eine SQLite-Unterstützung für den Core-Datenspeicher. Es scheint länger zu dauern, als ich es erwartet hätte. Ich habe die Routinen so getrimmt, dass es im Grunde nur versucht, ein Objekt zu holen (um zu sehen, ob es bereits existiert) und dann ein neues Objekt zu erstellen, wenn dies nicht der Fall ist (seit dem Datenimport). Das Holen ist jedoch nicht der zeitaufwendige Teil. Es ist die Schaffung der Objekte. Grundsätzlich ist der säumige Code:Wie kann ich die Leistung des Core Data-Objekts auf dem iPhone verbessern?
MobileObject *newObject = (MobileObject *)[NSEntityDescription insertNewObjectForEntityForName:objDesc inManagedObjectContext:managedObjectContext];
Ich habe bemerkt, dass auf dem Simulator, es am Anfang ziemlich schnell mit etwa 100 Objekten eine Sekunde erstellt. Es verlangsamt sich jedoch und bis zum Zeitpunkt, an dem fünftausend Objekte erzeugt werden, sind es fast 2 Sekunden für 100 Objekte und zu der Zeit, wenn zehntausend Objekte erzeugt werden, sind es 4 Sekunden pro 100 Objekte. Die gesamte Gruppe von 21000 Objekten benötigt mehr als 10 Minuten. Das ist mit dem ganzen tatsächlich nützlichen Code, der herausgenommen wird (das ist nur ein Fetch und ein Objekt, das erstellt wird). Und es ist viel viel langsamer auf dem tatsächlichen Gerät (um vielleicht 4 mal so viel).
Was ich nicht verstehe ist, warum Core-Daten schnell beginnen, dann aber langsamer werden. Ich habe sowohl mit Index als auch ohne Indizes für meine Daten versucht. Ich habe versucht, meinen eigenen Autorelease-Pool zu erstellen, den ich regelmäßig in meiner Schleife entleere. Ich habe versucht, nach jeder Objekterstellung zu speichern. Ich habe versucht, bis zum Ende zu warten, um zu sparen. Aber egal was ich tue, die Performance scheint immer noch miserabel. Ist es nur langsam, ein neues Objekt zu einem Kerndatenspeicher mit einigen tausend Objekten hinzuzufügen? Irgendwelche Vorschläge?
Ich sollte eigentlich sagen, dass die Fetches diejenigen sind, die eine erhebliche Menge an Zeit benötigen. Ich denke, das macht Sinn, denn wenn der Laden größer wird, gibt es mehr Objekte zu durchsuchen. – Mike
Nebenbei, die Besetzung in Ihrem Beispielcode ist unnötig. '-insertNewObjectForEntity ...' gibt eine 'id' zurück und wird daher nicht umgewandelt. –
Erstellen einer riesigen Datenbank auf diese Weise kann unglaublich langsam sein, wenn Sie bis zum Ende warten, um zu speichern. Generell spare ich nach jeweils einigen tausend neuen Objekten, habe nicht experimentiert, um die optimale Frequenz zu finden. –