【发布时间】:2018-09-07 07:39:01
【问题描述】:
我的 C# 控制台应用程序中有代码查询 SQL 中的 LARGE 数据集,并将其添加到 IEnumerable 集合中,以便稍后在应用程序中进行迭代。在返回少于 100K 行的 SQL 表上,它工作得很好,但我必须使用它来遍历 1 亿条记录,在 SQL 查询运行后,Dapper 尝试填充集合,我最终会出现 OUT OF MEMORY异常错误。我很确定这是因为它试图一次写入 1 亿个对象。有没有一种方法可以批量处理不超过 500K 个对象的集合,做我需要做的事情然后回来处理另一个 500K 等等?我基本上需要从 SQL 500K 记录中读取,然后将它们写入文件,读取另一个 500K,写入另一个文件。
public List<AxDlsd> GetDistinctDlsdObjects(AxApp axApp, OperationType operationType)
{
if (operationType == OperationType.Assessment)
{
string query = $"SELECT DISTINCT(clipid) from {axApp.dlname}";
using (var connection = _dbConnectionFactory.GetAxDbConnection())
{
//SqlMapper.Settings.CommandTimeout = 0;
List<AxDlsd> dlsdrecord = new List<AxDlsd>();
return connection.Query<AxDlsd>(query, commandTimeout: 0, buffered: false ).ToList();
}
}
【问题讨论】:
-
您的查询中的数据行太多,内存无法全部承载。
-
哦,不要使用 .ToList(),它可能会导致查询运行完全创建您的对象,从而导致 buffered: false 无效。
-
Dapper. Paging的可能重复
-
一开始就尝试将所有这些加载到内存中可能是一个错误。如果您有 1 亿条记录,请让数据库完成它的工作并自行响应搜索。仅仅通过网络将 100M 行从数据库移动到您的应用程序将花费比数据库处理 sql 语句并返回目标结果更长的时间。
标签: c# ienumerable