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在上下文的生命周期中持有第二个集合,它的这个集合会让你失去记忆。

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

  1. 每批更新您的上下文
  2. 在查询中使用.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