C# Linq2Sql内存不足异常

C# Linq2Sql内存不足异常,c#,.net,linq-to-sql,out-of-memory,C#,.net,Linq To Sql,Out Of Memory,当从数据库获取数据时,我的应用程序中遇到OutOfMemory异常。它是一个使用Linq2Sql的C.Net应用程序 我已经尝试使用GC.GetTotalMemory查看在调用数据库之前和之后占用了多少内存。这提供了一个很好的,虽然不是很准确的图片正在发生什么。当我查看Windows任务管理器时,我可以看到,使用以下代码以分页方式获取数据时,峰值工作集并不更小: public static void PreloadPaged() { int NoPoints = PointReposit

当从数据库获取数据时,我的应用程序中遇到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倍。我曾考虑过调用垃圾收集器,但我宁愿避免它。

您检索了太多的数据并将其存储在内存中,这就是为什么会出现OOM异常

发生了两件事中的一件:

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

加载较小的数据块20-50条记录,而不是50K或所有记录 如果这只是为了显示,那么查询所需内容的投影,而不是实体本身。
如果是第二种情况,那么就使用设计用于管理大量数据的ETL工具。我更喜欢SSIS,但SSIS也能工作。

为什么需要一次检索50000行?您打算进一步处理这些实体吗?50000只是我为实验目的选择的页面大小,我正在预取坐标网格,所有坐标都必须处理。因此,我只是将它们存储在一个实体列表中,并从那里访问它们,而不是每次需要另一个坐标时都必须建立一个新的数据库连接。也许Linq2SQL不是用于大量数据的最佳框架,我将研究您在这里建议的ETL工具,谢谢。