gpt4 book ai didi

c# - Entity Framework 大数据集,内存不足异常

转载 作者:IT王子 更新时间:2023-10-29 04:20:24 26 4
gpt4 key购买 nike

我正在处理一个非常大的数据集,大约有 200 万条记录。我有下面的代码,但在处理大约三批处理(大约 600,000 条记录)后出现内存不足异常。我知道当它循环遍历每个批处理 Entity Framework 时会延迟加载,然后尝试将完整的 200 万条记录构建到内存中。有没有办法卸载我处理过的那批?

ModelContext dbContext = new ModelContext();
IEnumerable<IEnumerable<Town>> towns = dbContext.Towns.OrderBy(t => t.TownID).Batch(200000);
foreach (var batch in towns)
{
SearchClient.Instance.IndexMany(batch, SearchClient.Instance.Settings.DefaultIndex, "Town", new SimpleBulkParameters() { Refresh = false });
}

注意:批处理方法来自这个项目:https://code.google.com/p/morelinq/

搜索客户端是这样的:https://github.com/Mpdreamz/NEST

最佳答案

问题是,当您从 EF 获取数据时,实际上创建了两个数据副本,一个返回给用户,另一个由 EF 保留并用于更改检测(以便它可以将更改保存到数据库)。 EF 在上下文的生命周期内保留第二个集合,这个集合会让你内存不足。

你有两种选择来处理这个问题

  1. 每批更新你的上下文
  2. 在您的查询中使用 .AsNoTracking(),例如:

    IEnumerable<IEnumerable<Town>> towns = dbContext.Towns.AsNoTracking().OrderBy(t => t.TownID).Batch(200000);

这告诉 EF 不要保留副本以进行更改检测。您可以在我的博客上阅读更多关于 AsNoTracking 的功能及其对性能的影响:http://blog.staticvoid.co.nz/2012/4/2/entity_framework_and_asnotracking

关于c# - Entity Framework 大数据集,内存不足异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18169859/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com