2012-12-19 20 views
9

Sto tentando di salvare centinaia di migliaia di record utilizzando il framework Entity.System.OutOfMemoryException che utilizza Entity Framework?

:: dopo aver salvato qualche centinaia di migliaia di record ottengo errore seguente System.OutOfMemoryException

Il mio codice

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

ho notato dopo aver salvato il mio 1000 record db non è prevalente un altro 1000 record. li sta aggiungendo nel mio dbcontext.

Sto creando una nuova istanza dopo 1000 record ma il mio db ha ancora i dati dell'oggetto precedente. Vedere il mio codice

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; 
       } 
      } 

risposta

12

Quanti oggetti hai intenzione di salvare e quanto è grande singolo oggetto? DbContext contiene riferimenti a tutti gli oggetti aggiunti con la chiamata AddObject. Chiamare il numero SaveChanges non cancella le sue strutture interne di dati, quindi se chiami il tuo codice per gli oggetti 1M avrai 1M oggetto in memoria e saranno completamente vivi perché il loro oggetto radice per GC sarà l'istanza di contesto che è ancora in ambito della tua esecuzione codice.

Se si desidera evitare il problema di memoria, è necessario utilizzare una nuova istanza di contesto per ogni 1000 record (o anche ogni record). L'unica differenza tra l'esecuzione di SaveChanges per 1000 record e per il record singolo è la transazione coinvolta automaticamente.

+0

posso cancellare la mia DbContext piuttosto che creare di nuovo? –

+0

Dovresti andare e impostare ogni oggetto aggiunto come distaccato. Creare una nuova istanza di contesto è molto meglio. –