He tenido algunos problemas con LINQ-To-SQL en cuanto al uso de la memoria. Lo estoy usando en un servicio de Windows para hacer algo de procesamiento, y estoy revisando una gran cantidad de datos que estoy retirando del contexto. Sí, sé que podría hacer esto con un procedimiento almacenado, pero hay razones por las que sería una solución menos que ideal.¿Cómo evito una pérdida de memoria con LINQ-To-SQL?
De todos modos, lo que veo básicamente es que la memoria no se libera incluso después de llamar al context.SubmitChanges()
. Así que termino teniendo que hacer todo tipo de cosas extrañas, como solo retirar 100 registros a la vez, o crear varios contextos y hacer que todos ellos realicen tareas por separado. Si guardo el mismo DataContext
y lo uso más tarde para otras llamadas, simplemente consume más y más memoria. Incluso si llamo al Clear()
en la matriz "var tableRows
" que me devuelve la consulta, configúrelo como nulo y llame al SYstem.GC.Collect()
; aún así no libera la memoria.
Ahora he leído algo acerca de cómo usar DataContexts
rápidamente y desecharlos rápidamente, pero parece que deberían ser una forma de forzar al contexto a volcar todos sus datos (o todos sus datos de seguimiento para un tabla particular) en un cierto punto para garantizar que la memoria sea gratuita.
¿Alguien sabe qué pasos garantizan que se libere la memoria?
Tenga en cuenta que como dijeron los otros caballeros, probablemente sea mejor usar muchos DataContexts en esta situación. Pero, dado que la pregunta era cómo garantizar la liberación de memoria dentro de un contexto, el método ClearCache() está más cerca de la respuesta. –
Sí, el uso o no de muchos datos depende de la cantidad de datos que tenga, puede aprender a manejar esto, aprendo de la serie RobConery MVC Road ... http://blog.wekeroad.com/category/mvc-storefront –
Así es como se puede llamar ClearCache(): context.GetType() InvokeMember ( \t "ClearCache", \t BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, \t nula, el contexto, null);. – Rafe