Estoy iterando a través de una tabla pequeña (~ 10 GB) con foreach/IQueryable y LINQ-to-SQL. es como la siguiente:Iterar a través de IQueryable con foreach produce una excepción de falta de memoria
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. :)
}
}
El depurador de Visual Studio lanza un fuera de excepción de memoria después de un corto periodo de tiempo en la base del bucle foreach. Supongo que las filas de dtable no están sonrojadas. ¿Qué hacer?
¿qué es lo que ya ha almacenado en la memoria que es mayor de 10 GB? ¿Querías decir 10 MB? – msarchet
Tengo 16 GB de memoria en esta máquina, pero al menos la mitad está en uso con cualquier combinación de Windows y SQL. No podía guardar 10 GB en la memoria, así que me quedé sin él. Me sorprende que IQueryable recupere toda la tabla ... Esperaría que obtuviera una o un pequeño número de filas a la vez. – Gleno
Parece que he podido evitar esto cambiando el objetivo de compilación a x64 en lugar de x86, lo que hace uso de más memoria en mi máquina. Sin embargo, los datos en los que estoy iterando en mi ciclo foreach no son enormes, así que creo que las cosas dentro del ciclo no están recogiendo basura correctamente. –