【问题标题】:EF4: Object Context consuming too much memoryEF4:对象上下文消耗太多内存
【发布时间】:2010-11-17 14:35:50
【问题描述】:

我有一个使用 EF4 针对 MS SQL Server 运行的报告工具。该报告的大部分内容涉及循环大约 5000 行,然后为每一行拉出许多其他行。 我通过一个数据上下文提取初始行。提取相关行的代码涉及使用另一个数据上下文,包装在 using 语句中。虽然看起来第二个数据上下文消耗的内存从未被释放,并且在引发内存不足异常之前使用量会飙升至 1.5GB。

这里是代码的 sn-p,以便您了解想法:

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 中还发生了什么?
  • 有一些代码可以为出口拉取子行并执行一些计算。然而,有相当多的这些行。最终结果是一组新对象添加到要保存到数据库的外部数据上下文中
  • 我怀疑添加到外部上下文是导致问题的原因。如果您只注释掉添加到外部数据上下文的代码,您的内存使用情况是否正常?一般来说,我不认为您希望打开一个上下文并同时保存大量要提交的更改。
  • 感谢您的想法。我会试一试,然后回复你

标签: entity-framework memory garbage-collection


【解决方案1】:

使用来自@adrift 的输入,我更改了代码,以便在循环的每次迭代之后保存更改,而不是全部保存在最后。在消耗太多内存之前,数据上下文可以愉快地持有大约 150,000 次挂起的写入,这似乎有一个限制(在我的情况下)。

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

【讨论】:

    猜你喜欢
    • 2020-04-16
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 2016-06-29
    • 1970-01-01
    相关资源
    最近更新 更多