9 Stimmen

Entity Framework entfernt Objekt aus dem Kontext, aber nicht aus der Datenbank

Ich arbeite an einem Batch-Prozess, der ~800.000 Datensätze aus einer langsamen Legacy-Datenbank (1,4-2ms pro Datensatz Abrufzeit ... es summiert sich) in MySQL, die ein wenig schneller durchführen kann. Um dies zu optimieren, lade ich alle MySQL-Datensätze in den Arbeitsspeicher, was die Nutzung auf etwa 200 MB bringt. Dann beginne ich mit dem Dumping aus der alten Datenbank und aktualisiere die Datensätze.

Ursprünglich würde ich nach Abschluss der Aktualisierung der Datensätze SaveContext aufrufen, wodurch mein Speicher von ~500MB-800MB auf 1,5GB ansteigen würde. Sehr bald würde ich keine Speicherausnahmen mehr bekommen (die virtuelle Maschine, auf der das Programm läuft, hat 2 GB RAM), und selbst wenn ich mehr RAM zur Verfügung stellen würde, sind 1,5 bis 2 GB immer noch ein wenig zu viel, und das wäre nur eine Notlösung für das Problem. Um das Problem zu beheben, habe ich angefangen, SaveContext alle 10.000 Datensätze aufzurufen, was die Sache etwas vereinfacht hat, und da ich Delegaten verwendet habe, um die Daten aus der Legacy-Datenbank zu holen und sie in MySQL zu aktualisieren, hatte ich keine allzu großen Leistungseinbußen, da nach der etwa 5-sekündigen Wartezeit beim Speichern die Aktualisierung im Speicher für die etwa 3000 gesicherten Datensätze durchgeführt wurde. Die Speichernutzung steigt jedoch weiterhin an.

Hier sind meine möglichen Probleme:

  • Die Daten kommen in beliebiger Reihenfolge aus der Legacy-Datenbank, so dass ich die Aktualisierungen nicht gruppieren und den ObjectContext regelmäßig freigeben kann.
  • Wenn ich nicht alle Daten vorher aus MySQL abrufe und sie stattdessen während des Aktualisierungsvorgangs nach Datensätzen abrufe, ist es unglaublich langsam. Stattdessen greife ich vorher auf alle Daten zu, lege sie in einem Wörterbuch ab, das durch den Primärschlüssel indiziert ist, und entferne die Datensätze aus dem Wörterbuch, während ich die Daten aktualisiere.

Eine mögliche Lösung, die ich dachte, ist irgendwie den Speicher frei, die von Entitäten, die ich weiß, ich werde nie wieder berühren, da Sie bereits aktualisiert wurden (wie Löschen des Cache, aber nur für ein bestimmtes Element), aber ich weiß nicht, wenn das sogar mit Entity Framework möglich ist.

Hat jemand eine Idee?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X