实体框架6内存使用量达到2GB

时间:2016-09-08 13:31:47

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

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

  • 使用用于上下文。
  • 保存批次中的更改并处理上下文。
  • 手动调用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()     
}

1 个答案:

答案 0 :(得分: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();
    }
}

这反转了使用声明在每批之后处理sqllite,从而将其清除并为每批开始新鲜。

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