我使用foreach/IQueryable和LINQ-to-SQL遍历一个小型(〜10GB)表。 看起来是这样的:使用foreach对IQueryable进行迭代会导致内存不足异常
using (var conn = new DbEntities() { CommandTimeout = 600*100})
{
var dtable = conn.DailyResults.Where(dr => dr.DailyTransactionTypeID == 1);
foreach (var dailyResult in dtable)
{
//Math here, results stored in-memory, but this table is very small.
//At the very least compared to stuff I already have in memory. :)
}
}
Visual Studio调试器在foreach循环的基础抛出一小会儿后,一个不折不扣的内存异常。我假设dtable的行没有被刷新。该怎么办?
那你已经存储在内存中是大于10GB?你的意思是10 MB? – msarchet 2010-09-10 21:01:30
我在这台机器上有16GB的内存,但是至少有一半的内存正在被任何窗口膨胀加上SQL缓存使用。我无法将10GB存储到内存中,所以我用完了。我很惊讶IQueryable检索整个表...我期望它一次获取一行或少量行。 – Gleno 2010-09-12 18:54:19
我似乎已经能够通过将编译目标更改为x64而不是x86,这使得我的机器上使用更多的内存。然而,我在我的foreach循环中迭代的数据并不是很大,所以我认为循环内部的东西没有正确地收集垃圾。 – 2012-08-15 16:55:16