2011-01-04 7 views
0

Hintergrund

Ok, so habe ich habe eine einfache LINQ to SQL-Datacontext mit einer Tabelle, mit etwa 900 MB im Wert von PDF-Dokumenten in einem VARBINARY Feld zu vermeiden, zusammen mit einige andere Identifikatoren. DeferredLoadingEnabled ist auf true eingestellt. Der Punkt des Codes ist, alle Dokumente in PDF-Dateien auf unserem Server zu exportieren.Releasing LINQ to SQL-Ressourcen OutOfMemoryException

Dies ist nicht das erste Mal, dass ich Bulk "Skript" wie Zeug mit Linq-to-Sql gemacht. Es ist ein großartiges Werkzeug, um einfach über viele Datensätze zu iterieren.

Problem

Mein Problem Iterationen meiner foreach (var c in ctx.Documents) nach ca. die die Report Feld nimmt und verwendet File.WriteAllBytes(docName, c.Report.ToArray()); es auf die Festplatte zu schreiben, erhalte ich eine OutOfMemoryException.

Da dies ein interner Code ist, habe ich einfach einen .Skip(1426) auf meine Auswahl verwendet und es erfolgreich abgeschlossen. Unnötig zu sagen, dass ich bei der Beobachtung meines Programmabsturzes tatsächlich keinen Speicher mehr hatte.

Gibt es irgendwelche guten Möglichkeiten, dies in Zukunft zu vermeiden, oder ist LINQ-to-SQL durch diese Einschränkung gebunden?

Eine mögliche Antwort Ich kann daran denken, ein Iterationslimit zu setzen und meinen DataContext alle 500 Datensätze neu zu instanziieren. Klingt aber nicht sehr gepflegt ...

Antwort

1

Haben Sie versucht mit ObjectChangeTracking ausgeschaltet (Readonly-Modus)?

+0

ja das hat es tatsächlich getan. Zu Ihrer Information: Ich habe DefredredLoadingEnabled deaktiviert und musste meine DBML-Datei in meinen großen Feldern leicht auf "Delay Loaded" deaktivieren. Schnelle Frage, was, wenn ich * es * ändern wollte? Wäre es akzeptabel, eine "update this" -Routine auszuführen und die ID weiterzugeben, und dann einen anderen Datenkontext zu verwenden, um die Aktualisierung durchzuführen? Vielleicht in Chargen? – Tom