2010-11-17 82 views
1

我有一個使用EF4針對MS SQL Server運行的報告工具。這份報告的大部分內容涉及大約5000行的循環,然後爲其中的每一行拉出許多其他行。 我通過一個數據上下文獲取最初的行。拉取相關行的代碼涉及使用另一個數據上下文,並使用using語句包裝。它會出現雖然第二個數據上下文消耗的內存永遠不會釋放,並且在引發內存不足異常之前,使用率會上升到1.5GB。EF4:消耗太多內存的對象上下文

這裏的代碼片段,所以你可以得到的想法:

var outlets = (from o in db.tblOutlets 
         where o.OutletType == 3 
         && o.tblCalls.Count() > number && o.BelongsToUser.HasValue && o.tblUser.Active == true 
         select new { outlet = o, callcount = o.tblCalls.Count() }).OrderByDescending(p => p.callcount); 

     var outletcount = outlets.Count(); 
     //var outletcount = 0; 
     //var average = outlets.Average(p => p.callcount); 


     foreach (var outlet in outlets) 
     { 
      using (relenster_v2Entities db_2 = new relenster_v2Entities()) 
      { 
       //loop over calls and add history 
       //check the last time the history table was added to for this call 
       var lastEntry = (from h in db_2.tblOutletDistributionHistories 
           where h.OutletID == outlet.outlet.OutletID 
           orderby h.VisitDate descending 
           select h).FirstOrDefault(); 
       DateTime? beginLooking = null; 

我曾希望通過使用第二數據背景下,內存可以在每次迭代之後被釋放。它會顯示它不是(或者GC沒有及時運行)

+0

「foreach」中還發生了什麼? – 2010-11-17 14:48:55

+0

有一些代碼可以爲出口拉動子行並執行一些計算。但是這些行有一大堆。最終結果是一組添加到外部數據上下文以保存到數據庫的新對象 – Sergio 2010-11-17 14:58:36

+1

我懷疑添加到外部上下文是導致問題的原因。如果你僅僅註釋掉增加到外部數據上下文的代碼,你的內存使用情況是否正常?總的來說,我不認爲你想要打開一個上下文並且保持大量的變化一次全部提交。 – 2010-11-17 15:06:31

回答

0

隨着@adrift的輸入,我修改了代碼,以便在循環的每次迭代後保存更改,而不是全部在結束。看起來有一個限制(無論如何)約有150,000個待處理的寫入,數據上下文可以在消耗太多內存之前愉快地進行。

通過允許它在每次迭代後寫入更改,它似乎可以更有效地管理內存,雖然它似乎使用盡可能多,但沒有拋出異常。