我在10,000页中分页150k行。我的意思是我带了10k行的数据库并迭代它们然后接下来的10k并做同样的事情,直到没有更多的行。问题是当我带来更多行时,我看到内存图在任务管理器的性能选项卡中增加,并且在每次迭代中使查询执行的10k行持续时间越来越长,直到抛出OutOfMemoryException。
查询是6个表的连接。我使用EF 4将结果加载到列表中。
在每次迭代结束时,我清除列表,将其设置为null并调用GC.Collect(),但这并没有任何效果。
我可以为已经检查过的行释放内存。
答案 0 :(得分:1)
尝试从数据库返回大型数据集时遇到了类似的问题。
通过从BackgroundWorker执行查询,它从UI线程中删除了负载,从而降低了任务的复杂性并消除了这个问题。
在我的查询中使用这种技术之前,我发现该应用程序从几百MB到最高处大约1.2GB,然后抛出OutOfMemoryException。在暗示BackgroundWorkder后,增加量仅为10 / 15mb,然后在完成后减少。我还建议执行查询的速度要快一些。
- 是的,我意识到这听起来并不像它会起作用,但实际上确实如此,我会推荐它。
此外,如果您使用的是64位操作系统(并且针对64位架构),则可以将内存限制从1.2GB提高到4GB。此选项可在Build选项卡下的Project Properties中找到...
根据数据库的不同,您可以通过创建视图并查询以收集结果集来将部分工作转移到该工作中。 ( - 更新)
答案 1 :(得分:0)
我很确定问题是由于持有相同的上下文实例来获取所有页面而引起的。通过这种方式,即使您不再需要先前获取的上下文,仍然可以跟踪所有这些内容。
您应该在获取新批记录之前创建新的DbContext实例。
您也可以尝试使用AsNoTracking()
方法。