c# - 迭代大型数据集时出现 OutOfMemoryException

标签 c# .net memory

我有一个大约有 100,000 行的表(而且它会变得更大)。

当我在循环中达到大约 80,000 条记录时,我的代码现在抛出 OutOfMemoryException(即使我的系统当时有超过 10gb 的空闲空间,看起来 visual studio 仅限于大约 1.5gb)。

该代码旨在遍历所有记录并仅检查某些条件。我取出了我实际处理记录的代码,内存仍然填满。

using (var db = new PlaceDBContext())
{
    Messages.Output("Total: " + db.Companies.Count());
    int count = 0;
    foreach (var company in db.Companies)
    {

        // I am not actually doing anything here,
        // I took out my code and the memory still fills up
        // CheckMatchConditions(company);

        count++;

        Console.SetCursorPosition(0, Console.CursorTop);
        Console.Write(count.ToString() + "          ");

    }

}

我认为这可能与保持上下文打开有关,因此我重构了代码以一次只获取 1,000 条记录并首先将它们全部枚举到一个列表中。这是我想出的:

int count = 0;
int total = 0;
using (var db = new PlaceDBContext())
{
    Messages.Output("Total: " + db.Companies.Count());
    total = db.Companies.Count();
}
while (count < total)
{
    List<Company> toMatch = new List<Company>();
    using (var db = new PlaceDBContext())
    {
        toMatch = db.Companies.Include(x => x.CompaniesHouseRecords).OrderBy(x => x.ID).Skip(count).Take(1000).ToList();
    }

    foreach (var company in toMatch)
    {

        // CheckMatchConditions(company);

        count++;

        Console.SetCursorPosition(0, Console.CursorTop);
        Console.Write(count.ToString() + "          ");

    }
}

这会慢很多,但仍会以大约相同的循环记录速率填满内存。

当我注释掉我实际做任何事情的方法时,它必须只是这些 toMatch 列表在内存中挥之不去。

我在这里不知所措,有人可以阐明我应该如何管理内存吗?

最佳答案

添加。 AsNoTracking () 确保 DbContext 不会跟踪实体。

using (var db = new PlaceDBContext())
{
    Messages.Output("Total: " + db.Companies.Count());
    int count = 0;
    foreach (var company in db.Companies.AsNoTracking())
    {
        count++;
        Console.SetCursorPosition(0, Console.CursorTop);
        Console.Write(count.ToString() + ". company : " + company.someProp);
    }
}

关于c# - 迭代大型数据集时出现 OutOfMemoryException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39958806/

相关文章:

.net - 无法加载引用库 - 该进程无法访问该文件,因为该文件正在被另一个进程使用

c# - 如何编写一个函数来调用另一个函数并捕获一些异常?

memory - 堆/栈和多进程

performance - MongoDB 将文档预加载到 RAM 中以获得更好的性能

java - java中年轻代和终身代内存的统计

c# - 在屏幕调整大小时自动移动剑道通知

c# - 如何在单独的 AppDomain 中托管 IronPython 引擎?

c# - 为什么 ExecuteStoredProcedure 有效而下面的代码无效?

c# - Linq where 三元和括号

c# - 什么是对话上下文?