Powtarzam przez małą tablicę (~ 10GB) z foreach/IQueryable i LINQ-SQL. Wygląda mniej więcej tak:Iterowanie poprzez IQueryable z foreach skutkuje wyjątkiem braku pamięci
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 debugger rzuca out-of wyjątkiem pamięci po krótkim czasie na bazie pętli foreach. Zakładam, że wiersze tabeli dtable nie są przepłukiwane. Co robić?
co masz już zapisany w pamięci, który jest większy niż 10 GB? Czy chodziło Ci o 10 MB? – msarchet
Mam 16 GB pamięci na tym komputerze, ale co najmniej połowa z nich jest używana przez cache Windows plus pamięć podręczną SQL. Nie mogłem zmieścić 10 GB pamięci, więc skończyło mi się to. Jestem zaskoczony, że IQueryable pobiera całą tabelę ... Spodziewam się, że pobierze jedną lub małą liczbę wierszy naraz. – Gleno
Wydaje mi się, że udało mi się ominąć to nieco, zmieniając cel kompilacji na x64 zamiast na x86, który wykorzystuje więcej pamięci na moim komputerze. Jednak dane, które przetwarzam w pętli foreach, nie są ogromne, więc myślę, że rzeczy wewnątrz pętli nie zbierają poprawnie śmieci. –