IEnumerable 集合 - 内存不足异常
IEnumerable Collection - Out of Memory Exception
我的 C# 控制台应用程序中有代码查询 SQL 中的大型数据集,并将其添加到我稍后用于在应用程序中循环访问的 IEnumerable 集合。在 SQL table returns 少于 10 万行的情况下,效果很好,但我必须使用它来遍历 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();
}
}
您可以 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 Server 2012。我不确定 SQL 您使用的是什么。
我的 C# 控制台应用程序中有代码查询 SQL 中的大型数据集,并将其添加到我稍后用于在应用程序中循环访问的 IEnumerable 集合。在 SQL table returns 少于 10 万行的情况下,效果很好,但我必须使用它来遍历 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();
}
}
您可以 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 Server 2012。我不确定 SQL 您使用的是什么。