Ich füge Zehntausende von Objekten in meine Core Data-Entität ein. Ich habe eine einzelne NSManagedObjectContext
und ich rufe save()
auf dem verwalteten Objekt Kontext jedes Mal, wenn ich ein Objekt hinzufügen. Es funktioniert, aber während es läuft, steigt der Speicher von etwa 27 Millionen auf 400 Millionen. Und es bleibt bei 400M, auch nachdem der Import beendet ist.
Es gibt eine Reihe von SO-Fragen zum Batch-Einfügen und jeder sagt, dass er Effizientes Importieren von Daten , aber es ist in Objective-C und ich habe Probleme, in Swift echte Beispiele zu finden, die dieses Problem lösen.
Es gibt ein paar Dinge, die Sie ändern sollten:
NSPrivateQueueConcurrencyType
verwalteten Objekte und führen Sie Ihre Einfügungen asynchron darin durch. autoreleasepool
und reset
, um die Objekte im Speicher nach jedem Stapel einzufügen und zu speichern. So könnte das funktionieren:
%Vor%Die Anwendung dieser Prinzipien hat meine Speicherauslastung niedrig gehalten und die Masseneinfügung beschleunigt.
Aktualisieren
Die obige Antwort wird komplett neu geschrieben. Danke an @Mundi und @MartinR in den Kommentaren für einen Hinweis auf einen Fehler in meiner ursprünglichen Antwort. Und danke an @JodyHagins in diese Antwort , um mir zu helfen, das Problem zu verstehen und zu lösen.
Tags und Links memory-leaks ios core-data swift bulkinsert