我在C#控制台应用程序中有代码,该代码正在查询SQL中的大数据集,并将其添加到IEnumerable集合中,该集合用于稍后在应用程序中进行迭代。在返回少于10万行的SQL表上,它工作得很好,但是我必须使用它来遍历1亿条记录,在SQL查询运行后,Dapper尝试填充集合后,我最终遇到了内存不足的情况异常错误。我可以肯定这是因为它试图一次写入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();
}
}
答案 0 :(得分:0)
您可以执行SELECT COUNT(DISTINCT clipid) from {axApp.dlname}
来获取总数,然后使用它来翻页
int pageSize = 500000;
for(var page = 0; page < (total / pageSize) + 1; page++)
{
string query = $"SELECT DISTINCT(clipid) from {axApp.dlname} ORDER BY clipid OFFSET {page * pageSize} FETCH NEXT {pageSize} ROWS ONLY";
///...
}
这将使您一次浏览50万行,无论页面大小如何。 FETCH / OFFSET确实需要SQL Server2012。我不确定您使用的是什么SQL。