EF4:对象上下文消耗太多内存

时间:2010-11-17 14:35:50

标签: entity-framework memory garbage-collection

我有一个使用EF4针对MS SQL Server运行的报告工具。此报告的一般大部分涉及循环大约5000行,然后为每个行拉动许多其他行。 我通过一个数据上下文拉出初始行。拉取相关行的代码涉及使用包含在using语句中的另一个数据上下文。虽然第二个数据上下文消耗的内存永远不会被释放,并且在引发内存不足异常之前使用率最高可达1.5GB。

这是代码片段,以便您可以了解:

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没有及时运行)

1 个答案:

答案 0 :(得分:0)

使用@adrift的输入我改变了代码,以便在循环的每次迭代之后保存更改,而不是在结束时全部。似乎存在一个限制(在我的情况下无论如何)大约150,000个待处理的写入数据上下文在消耗太多内存之前可以愉快地保存。

通过允许它在每次迭代后写入更改,看起来它可以更有效地管理内存,虽然它看起来确实使用了多少,但它没有抛出异常。