2016-09-08 80 views
5

我建立一個應用程序,並正在使用實體框架6.但我到內存使用的問題上運行。無論我嘗試什麼,我遲早會遇到內存不足錯誤。到目前爲止,我已經嘗試了以下內容:實體框架6內存達到2GB

  • 使用using作爲上下文。
  • 保存批次更改和處理上下文。
  • 手動調用GC.Collect()。

但是,這些都沒有阻止Entity框架使用更多的內存與我做的每個saveChanges。最終達到2GB的限制並導致我的程序崩潰。

有什麼辦法,我不知道的,使實體框架版本的所有記憶?

編輯

using (var sqlite = new myEntities()) 
{ 
    sqlite.Configuration.AutoDetectChangesEnabled = false; 
    sqlite.Configuration.ValidateOnSaveEnabled = false; 

    foreach (var someItem in someList) 
    { 
     var newItem = new Item 
     { 
      ... 
     }; 

     sqlite.tableName.Add(newItem); 

     if (++countRecords%1000 == 0) 
     { 
      sqlite.SaveChanges(); 

     } 
    } 
    sqlite.SaveChanges(); 
} 

如上所述以上我還嘗試設置上下文,而不使用和調用SaveChanges後設置它。

if (++countRecords%1000 == 0) 
{ 
    sqlite.SaveChanges(); 
    sqlite.Dispose(); 
    sqlite = new myEntities()  
} 
+2

是否爲每個數據庫請求創建新的Context實例? – Lance

+6

要獲得幫助,您需要找出一種方法來創建一個能夠再現內存問題的最小但完整的程序。否則,正如你可以理解的那樣,我們建議的任何事情都將是純粹的猜測。 – sstan

+1

你能分享你的EF查詢嗎? – Sampath

回答

1

如果這的確是一個批次的問題,嘗試這樣的事情:

int batchSize = 10; 

for (int i = 0; i < = someList.Count/batchSize; i++) 
{ 
    var batch = someList.Skip(batchSize * i).Take(batchSize); 

    using (var sqllite = new nyEntities()) 
    { 
     foreach(var item in batch) 
     { 
      var newItem = new Item() {...}; 

      sqllite.tableName.Add(newItem); 
     } 

     sqllite.SaveChanges(); 
    } 
} 

這反轉using語句每批後處置sqllite,從而清除出去,開始新的每批。

這段代碼在記事本寫了++,所以要小心把它清理乾淨,如果你嘗試一下。

+0

是否批量問題我真的很喜歡這個流程,謝謝。 – BeebFreak