2012-04-17 16 views
5

Ho notato un problema di memoria quando lascio la mia app in esecuzione per un lungo periodo. In realtà ottengo un'eccezione di memoria insufficiente. Cerco di capire qual è il problema e non ho capito fino a quando non lo lascio correre di nuovo e ho notatoProblemi di memoria quando si utilizza HtmlAgilityPack?

Ho la perdita su questa linea ogni volta html.LoadHtml(a_few_k_of_html);. Sospetto che HtmlAgilityPack stia perdendo. Ho provato a farlo usando e chiamando dispose ma non esiste. Non solo accade su quella linea ogni volta ma ricordo di aver cambiato alcune aree per usare HtmlAgilityPack invece di parsing html with regex

Come faccio a gestire questo problema di memoria a meno di modificare HtmlAgilityPack stesso?

+0

Il codice conserva un riferimento ai risultati di html.LoadHtml? Sei sicuro che il tuo codice non stia più facendo riferimento a questo? –

+0

var html ha solo lo scopo di quella funzione e non viene utilizzato da nessun'altra parte. Sono sicuro che non lo sto riferendo da nessuna parte. Questa sarebbe la mia prima perdita di sempre e penso che possa avere a che fare con il backend HtmlAgilityPack. @EricJ. –

+0

Puoi riprodurre questo in un semplice programma di test? Sarei sorpreso di scoprire che l'Html Agility Pack perde. Lo uso in un programma di lunga durata (il mio crawler Web che funziona per giorni alla volta, scaricando migliaia di pagine al minuto) e non ho notato alcuna perdita. –

risposta

2

Ho avuto lo stesso problema. Dopo aver elaborato il documento, ho impostato l'istanza del documento su null e poi su GC.Collect(). Il problema è stato risolto.

+0

Non penso che chiamare GC.Collect sia una buona idea. http://programmers.stackexchange.com/questions/276585/when-is-it-a-good-idea-to-force-garbage-collection –

+0

+1 no non è una buona idea (è un caso raro in effetti) ma di fronte a una dll che causa problemi questo lo ha risolto per me. Nel mio caso volevo togliere il testo da 300.000 documenti e questo era l'unico modo attraverso il mio dolore – Rippo

1

Prova a utilizzare HtmlAgilityPack.HtmlDocumentLoad() metodo di utilizzo di 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 
Problemi correlati