从数据库中提取时,我在应用程序中遇到OutOfMemory异常。它是使用Linq2Sql的C#.Net应用程序。
我尝试使用GC.GetTotalMemory()
来查看在调用数据库之前和之后占用了多少内存。这给出了一个很好但虽然不太准确的图片显示正在发生的事情。当我查看Windows任务管理器时,我可以看到使用以下代码以分页方式获取数据时峰值工作集不小:
public static void PreloadPaged()
{
int NoPoints = PointRepository.Count();
int pagesize = 50000;
int fetchedRows = 0;
while (fetchedRows < NoPoints)
{
PreloadPointEntity.Points.AddRange(PointRepository.ReadPaged(pagesize, fetchedRows));
PointRepository.ReadPointCollections();
PreloadPointEntity.PointCollections.Count());
fetchedRows += pagesize;
}
}
private static List<PointEntity> ReadPaged(int pagesize, int fetchedRows)
{
DataModel dataContext = InstantiateDataModel();
var Points = (from p in dataContext.PointDatas
select p.ToEntity());
return Points.Skip(fetchedRows).Take(pagesize).ToList();
}
我想这是Linq2Sql代码耗尽内存而不是重复使用或之后释放它,但是我该怎么办才能让内存打印下来呢?
我观察到它使用10倍的内存来获取数据,就像它将它们存储在我的enties列表中一样。我考虑过调用垃圾收集器,但我宁愿避免它。
答案 0 :(得分:2)
您正在检索太多数据并将其存储在内存中,这就是您获得OOM异常的原因。
正在发生两件事中的一件:
如果是第一个,你需要
如果它是第二个而不是使用旨在管理大量数据的ETL工具。我更喜欢Rhino.ETL,但SSIS也有效。