2012-04-17 34 views
5

Me aparece un problema de memoria cuando dejo mi aplicación en ejecución durante mucho tiempo. De hecho, tengo una excepción de falta de memoria. Intento averiguar cuál era el problema y no tenía ni idea hasta que lo dejé funcionar nuevamente y me di cuenta¿Problemas de memoria al usar HtmlAgilityPack?

Me sale la fuga en esta línea cada vez html.LoadHtml(a_few_k_of_html);. Sospecho que HtmlAgilityPack está goteando. Traté de envolverlo en usar y llamar a disponer, pero eso no existe. No solo sucede en esa línea cada vez, sino que recuerdo cambiar algunas áreas para usar HtmlAgilityPack en lugar de parsing html with regex

¿Cómo manejo este problema de memoria si no modifico HtmlAgilityPack?

+0

¿Su código conserva una referencia a los resultados de html.LoadHtml? ¿Estás seguro de que tu código ya no hace referencia a él? –

+0

El var html solo tiene el alcance de esa función y no se usa en ningún otro lado. Estoy seguro de que no lo estoy haciendo referencia en ningún lado. Esta sería mi primera filtración y creo que puede tener que ver con el backend HtmlAgilityPack. @EricJ. –

+0

¿Se puede reproducir esto en un programa de prueba simple? Me sorprendería descubrir que Html Agility Pack está goteando. Lo uso en un programa de larga ejecución (mi rastreador web que se ejecuta durante días a la vez, descarga miles de páginas por minuto) y no he notado ninguna fuga. –

Respuesta

2

Tuve el mismo problema. Después de procesar el documento, configuro la instancia del documento como nulo y luego como GC.Collect(). Problema fue resuelto.

+0

No creo que llamar a GC.Collect sea una buena idea. http://programmers.stackexchange.com/questions/276585/when-is-it-a-good-idea-to-force-garbage-collection –

+0

+1 no es una buena idea (es un caso raro) pero cuando me enfrento con un dll que causa problemas, esto me lo solucionó. En mi caso, quise quitar el texto de 300,000 documentos y esta fue la única forma de superar mi dolor – Rippo

1

Intente utilizar el método HtmlAgilityPack.HtmlDocumentLoad() insted de usar LoadHtml().

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 
MemoryStream ms = new MemoryStream(Encoding.Default.GetBytes(a_few_k_of_html)); 
doc.Load(ms); 
ms.Close();// <-- Important 
//Do whatever you want with HtmlDocument 
Cuestiones relacionadas