Я повторяю небольшую таблицу (~ 10 ГБ) с помощью foreach/IQueryable и LINQ-to-SQL. Выглядит примерно так:Итерация через IQueryable с foreach приводит к исключению из памяти
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 отладчик выдает вне-исключение памяти после короткого времени на базе цикла Еогеаспа. Я предполагаю, что строки dtable не очищаются. Что делать?
что вы уже хранятся в памяти, которая больше, чем 10GB? Возможно, вы имели в виду 10 МБ? – msarchet
У меня на этой машине 16 ГБ памяти, но по крайней мере половина из них используется любыми раздутыми окнами и кэшами SQL. Я не мог вместить 10 ГБ в память, поэтому у меня не получилось. Я удивлен тем, что IQueryable извлекает всю таблицу ... Я бы ожидал, что она выберет одно или небольшое количество строк за раз. – Gleno
Кажется, мне удалось немного обойти это, изменив цель компиляции на x64 вместо x86, которая использует больше памяти на моей машине. Тем не менее, данные, которые я повторяю в моем цикле foreach, не огромны, поэтому я думаю, что материал внутри цикла не получает сбор мусора должным образом. –