2012-12-19 15 views
9

我試圖使用實體框架保存數十萬條記錄。節省幾十萬的記錄後,我得到以下錯誤:使用實體框架的System.OutOfMemoryException?

:System.OutOfMemoryException的

我的代碼

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

我節省了1000條記錄,我的數據庫是不重寫另一個1000次記錄後發現。它將它們添加到我的dbcontext中。

我在創建1000個記錄後創建了一個新的實例,但是我的數據庫仍然有前一個對象的數據。查看我的代碼

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

回答

12

要保存多少個對象以及單個對象有多大? DbContext保存對所有添加了AddObject調用的對象的引用。調用SaveChanges不會清除其內部數據結構,因此如果您爲1M對象調用代碼,則內存中將有1M對象,並且它們將完全處於活動狀態,因爲它們的GC根對象將是仍處於運行範圍內的上下文實例碼。

如果你想避免內存問題,你應該爲每1000條記錄(甚至每條記錄)使用一個新的上下文實例。對於1000條記錄和單條記錄運行SaveChanges唯一的區別是自動涉及的事務。

+0

可以清除我的DbContext而不是重新創建? –

+0

你將不得不去,並設置每個添加的對象分離。創建一個新的上下文實例是更好的方法。 –