entity framework大数据集,内存不足exception
我正在处理一个非常大的数据集,大约有200万条记录。 我有下面的代码,但在处理了三个批次,大约600,000条记录之后得到了一个内存不足的例外。 我理解,因为它循环遍历每个批处理entity framework的延迟加载,然后尝试将完整的200万条记录构建到内存中。 有没有办法卸载我处理过的批次?
ModelContext dbContext = new ModelContext(); IEnumerable<IEnumerable> 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 }); }
注意:Batch方法来自此项目: https : //code.google.com/p/morelinq/
搜索客户端是这样的: https : //github.com/Mpdreamz/NEST
问题是,当您从EF获取数据时,实际上创建了两个数据副本,一个是返回给用户的,另一个是EF保留并用于更改检测(以便它可以保持对数据库的更改) 。 EF在上下文的生命周期中持有第二个集合,它的这个集合会让你失去记忆。
你有两个选择来处理这个问题
- 每批更新您的上下文
-
在查询中使用.AsNoTracking(),例如:
IEnumerable
> 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大数据集,内存不足exception分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/989751.html