Linq2Sql内存不足异常

时间:2012-06-21 10:40:04

标签: c# .net linq-to-sql out-of-memory

从数据库中提取时,我在应用程序中遇到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列表中一样。我考虑过调用垃圾收集器,但我宁愿避免它。

1 个答案:

答案 0 :(得分:2)

您正在检索太多数据并将其存储在内存中,这就是您获得OOM异常的原因。

正在发生两件事中的一件:

  1. 当用户只查看结果的子集和/或这是第一次尝试“缓存”数据时,您正在加载过多的数据。
  2. 您确实需要所有这些数据,但使用错误的技术(Linq2Sql)来访问数据。
  3. 如果是第一个,你需要

    1. 加载较小的数据块(20-50条记录,而不是50K或所有内容)
    2. 如果这仅用于显示目的,则查询所需内容的投影,而不是实体本身。
    3. 如果它是第二个而不是使用旨在管理大量数据的ETL工具。我更喜欢Rhino.ETL,但SSIS也有效。