Speicherleck mit großem Core Data-Batch in Swift einfügen

8

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.

    
Suragch 16.08.2015, 10:34
quelle

1 Antwort

15

Es gibt ein paar Dinge, die Sie ändern sollten:

  • Erstellen Sie einen separaten Kontext für NSPrivateQueueConcurrencyType verwalteten Objekte und führen Sie Ihre Einfügungen asynchron darin durch.
  • Speichern Sie nicht nach dem Einfügen jedes einzelnen Entitätsobjekts. Fügen Sie Ihre Objekte in Stapeln ein und speichern Sie dann jeden Stapel. Eine Stapelgröße kann etwa 1000 Objekten entsprechen.
  • Verwenden Sie 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.

Weiter lesen

  • Effizientes Importieren von Daten (Der alte Apple Docs-Link ist beschädigt. Wenn Sie ihn finden können, helfen Sie mir bitte.)
  • Kerndatenleistung
  • Kerndaten (Hauptpost)

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.

    
Suragch 16.08.2015, 10:34
quelle