Tengo la tarea de mejorar un código que genere informes masivos, de la manera que considere más conveniente.Diagnóstico de .NET OutOfMemoryException al generar informes
Hay alrededor de 10 informes idénticos generados (para cada 'sección' de la base de datos), y el código para ellos es similar a esto:
GeneratePurchaseReport(Country.France, ProductType.Chair);
GC.Collect();
GeneratePurchaseReport(Country.France, ProductType.Table);
GC.Collect();
GeneratePurchaseReport(Country.Italy, ProductType.Chair);
GC.Collect();
GeneratePurchaseReport(Country.Italy, ProductType.Table);
GC.Collect();
Si quito esos GC.Collect()
llamadas, se bloquea el servicio de informes con OutOfMemoryException
.
La mayor parte de la memoria se guarda en un enorme List<T>
que está lleno dentro de GeneratePurchaseReport
y ya no se usa tan pronto como sale, por lo que una colección completa de GC recuperará la memoria.
Mi pregunta es doble:
- ¿Por qué el GC hacer esto por sí solo? Tan pronto como se esté quedando sin memoria en el segundo
GeneratePurchaseReport
, debería hacer una colección completa antes de colgar y grabar, ¿no es así? - ¿Hay algún límite de memoria que pueda aumentar de alguna manera? No me importa en absoluto si los datos se intercambian en el disco, ¡pero el proceso .net está utilizando mucha menos memoria que incluso los 2.5 GB de RAM disponibles! Esperaría que solo fallara si se queda sin espacio de direcciones, pero en una máquina de 64 bits dudo que eso pase tan pronto.
Bueno, cuando miré solo el título, pensé que necesitabas algún tipo de aplicación de estrés que intente grabar memoria con fines de prueba. –
¿Qué es *** GeneratePurchaseReport ***? ¿Informe local RDLC o RDL remoto en servidor SSRS? – Kiquenet
** GcHelper ** https://github.com/mcctomsk/MccTomskHelpers/blob/560a079172468fd44ce952fbfcd676d297602442/Core/GcHelper.cs Notas: http://stackoverflow.com/questions/10016541/garbage-collection-not-happening-even cuando necesitábamos y _La razón por la que se llama a GC.Collect dos veces: http://stackoverflow.com/questions/3829928/under-what-circumstances-we-need-to-call-gc-collect-twice_ – Kiquenet