2010-11-17 71 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个待处理的写入,数据上下文可以在消耗太多内存之前愉快地进行。

通过允许它在每次迭代后写入更改,它似乎可以更有效地管理内存,虽然它似乎使用尽可能多,但没有抛出异常。