IEnumerable集合-内存不足异常

时间:2018-09-06 20:16:41

标签: c# ienumerable

我在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();

            }
        }

1 个答案:

答案 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。