2012-06-21 94 views
0

从数据库中获取数据时,我在应用程序中遇到了OutOfMemory异常。它是一个使用Linq2Sql的C#.Net应用程序。Linq2Sql内存不足异常

我试过使用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倍的内存来获取数据,因为它将它们存储在我的物品列表中。我曾考虑调用垃圾收集器,但我宁愿避免它。

+2

为什么你需要'50000'行被一次性检索? –

+0

你打算如何进一步处理这些实体? –

+0

50000只是我的页面大小选择用于实验目的,我预取的坐标网格都必须处理。所以我只是将它们存储在一个实体列表中,并从那里访问它们,而不是每次需要另一个坐标时都必须创建一个新的数据库连接。 – Keller

回答

2

您正在检索太多数据并将其存储在内存中,这就是为什么您会收到OOM异常。

1的两件事情发生:

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

,如果它是第一个,你需要或者数据的

  1. 负荷较小的块(20-50记录,而不是50K或一切)
  2. ,如果这是仅用于显示的目的,然后查询需要什么的预测,而不是实体本身。

,如果它不是用设计来管理大量数据的ETL工具的第二位。我更喜欢Rhino.ETL,但SSIS也适用。

+0

也许Linq2SQL不是用于数据量的最佳框架,我会研究你在这里推荐的ETL工具,谢谢。 – Keller