迭代大型数据集时OutOfMemoryException

本文关键字:OutOfMemoryException 数据集 大型 迭代 | 更新日期: 2023-09-27 18:12:36

我有一个大约有100,000行的表(并且它将变得越来越大)。

我的代码现在抛出了一个OutOfMemoryException,当我在我的循环中达到大约80,000条记录时(即使我的系统有超过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() + "          ");
    }
}

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

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列表。

我在这里的损失,可以有人透露一些光我应该如何管理内存?

迭代大型数据集时OutOfMemoryException

添加. 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);
    }
}

不要遍历对象集合,因为EF跟踪在您选择实体为对象时发生了变化。迭代一些DTO

db.Companies.Select(c => new CompanyDto{ Name = c.Name});

但是最好不要遍历整个数据集合。请尝试在LINQ中编写检查条件方法,以允许SQL服务器进行过滤。

相关文章:
  • 没有找到相关文章