Entity framework EF4:对象上下文占用太多内存

Entity framework EF4:对象上下文占用太多内存,entity-framework,memory,garbage-collection,Entity Framework,Memory,Garbage Collection,我有一个使用EF4运行在MS SQL Server上的报告工具。本报告的大部分内容涉及到在5000行上循环,然后为每一行抽取许多其他行。 我通过一个数据上下文提取初始行。提取相关行的代码涉及使用另一个数据上下文,该数据上下文包装在using语句中。但是,第二个数据上下文所消耗的内存似乎永远不会被释放,并且在抛出内存不足异常之前,使用量会飙升到1.5GB 下面是一段代码,您可以了解: var outlets = (from o in db.tblOutlets

我有一个使用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;

我曾希望通过使用第二个数据上下文,每次迭代后都可以释放内存。如果@adrift I的输入改变了代码,那么在循环的每次迭代之后保存更改,而不是在循环结束时保存更改,那么它看起来不是(或者GC没有及时运行)

。在消耗太多内存之前,数据上下文可以愉快地保存大约150000个挂起的写操作,这似乎是一个限制(无论如何,在我的例子中)


通过允许它在每次迭代后写入更改,它似乎可以更有效地管理内存,尽管它似乎使用了同样多的内存,但它没有引发异常。

foreach中还发生了什么??有一些代码将子行拉入插座并执行一些计算。然而,这些行的数量相当大。最终结果是一组添加到外部数据上下文的新对象将保存到数据库。我怀疑添加到外部上下文是导致问题的原因。如果只注释掉添加到外部数据上下文中的代码,内存使用是否正常?总的来说,我认为您不希望打开上下文并同时提交大量更改。谢谢您的想法。我试试看,然后再给你答复