2012-12-19 27 views
9

Ich versuche, Hunderttausende von Aufzeichnungen mit Entity-Framework zu speichern. Nach dem Speichern einige Hunderttausende von Datensätzen erhalten ich Fehler folgende:System.OutOfMemoryException mit Entity Framework?

: System.OutOfMemoryException

Mein Code

foreach (BibContent objbibcontents in lstBibContent) 
     { 
      db.BibContents.AddObject(objbibcontents); 
      c = c + 1; 
      if (c == 1000) 
      { 
       db.SaveChanges(); 
       c = 0; 
      } 
     } 

bemerkte ich nach dem Speichern 1000 zeichnet meine db nicht zwingende weitere 1000 Datensätze ist. Es fügt sie meinem dbcontext hinzu.

Ich erstelle eine neue Instanz nach 1000 Datensätze, aber meine DB hat immer noch die Daten des vorherigen Objekts. Siehe meinen Code

foreach (var objbibcontents in lstBibContent) 
      { 
       vibrantEntities db1 = new vibrantEntities(szConStr); 
       lstBibCon.Add(objbibcontents); 
       // db.BibContents.AddObject(objbibcontents); 
       c = c + 1; 
       if (c == 1000) 
       { 
        foreach (BibContent bibobject in lstBibCon) 
        { 
         db1.BibContents.AddObject(bibobject); 
        } 
        lstBibCon.Clear(); 
        db1.SaveChanges(); 
        c = 0; 
        flag = 1; 
       } 
      } 

Antwort

12

Wie viele Objekte werden Sie speichern und wie groß ist ein einzelnes Objekt? DbContext enthält Verweise auf alle Objekte, die Sie mit AddObject aufrufen. Der Aufruf SaveChanges löscht seine internen Datenstrukturen nicht. Wenn Sie also Ihren Code für 1M-Objekte aufrufen, haben Sie ein 1M-Objekt im Speicher, und sie sind vollständig aktiv, da ihr Stammobjekt für GC die Kontextinstanz ist, die sich noch in der Ausführung befindet Code.

Wenn Sie das Speicherproblem vermeiden möchten, sollten Sie eine neue Kontextinstanz für jeweils 1000 Datensätze (oder sogar für jeden Datensatz) verwenden. Der einzige Unterschied zwischen der Ausführung von SaveChanges für 1000 Datensätze und für einen einzelnen Datensatz ist die automatisch beteiligte Transaktion.

+0

kann ich meine DbContext löschen eher dann wieder schaffen? –

+0

Sie müssten jedes hinzugefügte Objekt als getrennt setzen. Das Erstellen einer neuen Kontextinstanz ist viel besser. –