【发布时间】:2013-08-11 07:46:39
【问题描述】:
我正在处理一个非常大的数据集,大约有 200 万条记录。我有下面的代码,但是在处理了大约三批(大约 600,000 条记录)后出现内存不足异常。我知道,当它遍历每个批处理实体框架延迟加载时,它会尝试将完整的 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 });
}
注意:Batch 方法来自本项目:https://code.google.com/p/morelinq/
搜索客户端是这样的:https://github.com/Mpdreamz/NEST
【问题讨论】:
-
大量数据是我不确定 ORM 是否合适的工具的场景...
-
@Vadim,ORM 是处理业务逻辑的合适工具,无需担心底层数据存储,但是使用 ORM 编写批处理有更简单的方法。
-
@AkashKava,当然是。问题是,当您将 ORM 与大量数据相结合时,您总是会发现自己“取消”了在其他场景中您会认为是特性的各种 ORM 方面。在其他情况下,您以专门解决您正在使用的 ORM 问题的方式编写代码。我要说的是 - 鉴于大量数据 ORM 变得有问题。
-
@Vadim,它变得有问题只是因为它做错了,并不意味着它不应该被使用。永远不要在内存中一次处理大量数据,而应该使用正确的批处理方式。请参阅我的回答,我们每天都在使用 ORM 处理数百万条记录。大型操作必须分解为较小步骤的集合。
-
Batch 与
Skip(batchNo*batchSize).Take(batchSize)有何不同?
标签: c# entity-framework