SQL 查询从 SQL 服务器获取大量数据时出现 OutOfMemoryException
OutOfMemoryException with SQL query getting large amount of data from SQL Server
我正在进行迁移,当我尝试从 SQL 服务器获取数据时遇到了糟糕的性能。我的做法是:
ctx.ExampleEntity.Database.SQLQuery<ClassConverter>("Select....")
ClassConverter
是一个class,与ExampleEntity
没有关系。问题是我从该查询中获得了超过 150 万条记录,当它尝试创建列表时,它抛出一个 OutOfMemoryException
而我无法避免。
是EF 6.0
////////////////////////////////解决方案
根据Mayu的回答,我写了这段代码,1M不抛异常。 sql return 不在最终数据库中的记录。
List<ClassConverter> listRowsToInsert = new List<ClassConverter>();
int countRecords=-1;
int skipCount = 0;
while(countRecords!=0){
List<ClassConverter> listIndivInsert = genEntitAgp.Database.SqlQuery<ClassConverter>(File.ReadAllText("sql/limitPfm.sql")).Skip(skipCount).Take(1000000).ToList();
countRecords = listIndivInsert.Count();
listRowsToInsert.AddRange(listIndivInsert);
if (countRecords < 1000000)
countRecords = 0;
skipCount += 1000000;
}
有什么想法吗?
感谢大家
如果您使用的是 EF 6.0,您可以映射实体然后使用 db.Records.Skip(n).Take(m)
批量处理它们吗?
我正在进行迁移,当我尝试从 SQL 服务器获取数据时遇到了糟糕的性能。我的做法是:
ctx.ExampleEntity.Database.SQLQuery<ClassConverter>("Select....")
ClassConverter
是一个class,与ExampleEntity
没有关系。问题是我从该查询中获得了超过 150 万条记录,当它尝试创建列表时,它抛出一个 OutOfMemoryException
而我无法避免。
是EF 6.0
////////////////////////////////解决方案
根据Mayu的回答,我写了这段代码,1M不抛异常。 sql return 不在最终数据库中的记录。
List<ClassConverter> listRowsToInsert = new List<ClassConverter>();
int countRecords=-1;
int skipCount = 0;
while(countRecords!=0){
List<ClassConverter> listIndivInsert = genEntitAgp.Database.SqlQuery<ClassConverter>(File.ReadAllText("sql/limitPfm.sql")).Skip(skipCount).Take(1000000).ToList();
countRecords = listIndivInsert.Count();
listRowsToInsert.AddRange(listIndivInsert);
if (countRecords < 1000000)
countRecords = 0;
skipCount += 1000000;
}
有什么想法吗?
感谢大家
如果您使用的是 EF 6.0,您可以映射实体然后使用 db.Records.Skip(n).Take(m)
批量处理它们吗?