【问题标题】:Entity Framework 6 memory usage reaches 2GBEntity Framework 6 内存使用达到 2GB
【发布时间】:2016-09-08 13:31:47
【问题描述】:

我正在构建一个应用程序并使用 Entity Framework 6。但我遇到了内存使用问题。无论我尝试什么,我迟早都会遇到内存不足的错误。到目前为止,我已经尝试了以下方法:

  • 将 using 用于上下文。
  • 批量保存更改并处理上下文。
  • 手动调用 GC.Collect()。

但是这些都不能阻止 Entity 框架在我执行的每个 saveChanges 中使用更多内存。最终达到 2GB 的限制并导致我的程序崩溃。

有什么我不知道的方法可以让实体框架释放所有内存吗?

编辑

using (var sqlite = new myEntities())
{
    sqlite.Configuration.AutoDetectChangesEnabled = false;
    sqlite.Configuration.ValidateOnSaveEnabled = false;

    foreach (var someItem in someList)
    {
        var newItem = new Item
        {
             ...
        };

        sqlite.tableName.Add(newItem);

        if (++countRecords%1000 == 0)
        {
            sqlite.SaveChanges();

        }
    }
    sqlite.SaveChanges();
}

如上所述,我也尝试过在 SaveChanges 之后设置上下文而不使用和处理它。

if (++countRecords%1000 == 0)
{
    sqlite.SaveChanges();
    sqlite.Dispose();
    sqlite = new myEntities()     
}

【问题讨论】:

  • 您是否为每个对数据库的请求创建新的上下文实例?
  • 要获得帮助,您需要找到一种方法来创建一个最小但完整的程序来重现内存问题。否则,正如您肯定可以理解的那样,我们提出的任何建议都是纯粹的猜测。
  • 你能分享你的 EF 查询吗?
  • someList 中有多少项?
  • 你确定 EF 正在吃掉所有的内存吗?您甚至尝试在循环中处理和重新创建新的 EF 上下文这一事实暗示了问题出在其他地方。您发布的代码很有帮助,但它仍然不是MCVE,因为我们无法使用它来重现您的问题。

标签: c# entity-framework-6 out-of-memory


【解决方案1】:

如果确实是批处理问题,请尝试以下操作:

int batchSize = 10;

for (int i = 0; i < = someList.Count / batchSize; i++)
{
    var batch = someList.Skip(batchSize * i).Take(batchSize);

    using (var sqllite = new nyEntities())
    {
        foreach(var item in batch)
        {
            var newItem = new Item() {...};

            sqllite.tableName.Add(newItem);
        }

        sqllite.SaveChanges();
    }
}

这会反转 using 语句以在每批之后处理 sqllite,从而将其清除并为每批重新开始。

这段代码是用notepad++编写的,所以如果你尝试一下,请小心清理它。

【讨论】:

  • 批量问题与否我真的很喜欢这个流程,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-28
  • 2014-08-29
  • 1970-01-01
  • 2017-12-30
  • 2014-03-20
  • 2015-06-07
  • 2015-04-30
相关资源
最近更新 更多