c# - Entity Framework 6 内存使用量达到 2GB

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

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

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

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

有什么我不知道的方法可以让 Entity Framework 释放所有内存吗?

编辑

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()     
}

最佳答案

如果确实是批处理问题,试试这样:

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++ 编写的,因此如果您尝试使用,请小心清理它。

关于c# - Entity Framework 6 内存使用量达到 2GB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39392372/

相关文章:

c# - 当应用程序未使用那么多内存时如何获得 System.OutOfMemoryException

asp.net - 使用FileStream ASPNET发送大文件500MB时出现OutOfMemoryException

c# - MvvmCross Windows Store 如何将不同的 ViewModel 绑定(bind)到 Appbar?

c# - WCF 服务主机何时销毁自定义 IDispatchMessageInspector?

c# - mvc c#合并两个以上的查询结果

c# - EF6 代码第一个多重一对多映射问题/"Multiplicity"错误

c# - 创建第二个 EDMX 文件永远不会运行实体数据模型向导

c# - Entity Framework : Cascade delete works other way round than expected

python - 将 rbf 与 scipy 一起使用时出现内存错误

c# - For vs. Linq - 性能 vs. future