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没有及时运行)
“foreach”中还发生了什么? – 2010-11-17 14:48:55
有一些代码可以为出口拉动子行并执行一些计算。但是这些行有一大堆。最终结果是一组添加到外部数据上下文以保存到数据库的新对象 – Sergio 2010-11-17 14:58:36
我怀疑添加到外部上下文是导致问题的原因。如果你仅仅注释掉增加到外部数据上下文的代码,你的内存使用情况是否正常?总的来说,我不认为你想要打开一个上下文并且保持大量的变化一次全部提交。 – 2010-11-17 15:06:31