2012-04-17 23 views
5

Uygulamamı uzun süre çalıştırdığımda bir bellek sorunuyla karşılaşıyorum. Aslında bir bellek istisnası aldım. Sorunun ne olduğunu anlamaya çalışıyorum ve tekrar çalışmasına izin verene kadar clueless veHtmlAgilityPack kullanırken bellek sorunları?

Bu satırda her zaman html.LoadHtml(a_few_k_of_html); numaralı sızıntıyı görüyorum. HtmlAgilityPack'in sızdırdığını sanıyorum. Kullanarak ve paketleyerek atmayı denedim ama bu yok. Sadece bu satırda her seferinde gerçekleşmez, ancak HtmlAgilityPack'in yerine parsing html with regex

'u kullanmak için bazı alanları değiştirmeyi hatırlıyorum HtmlAgilityPack'in kendisini değiştirmenin kısa bir süresinde bu bellek sorunuyla nasıl ilgilenirim?

+0

Kodunuz html.LoadHtml sonuçlarının referansını tutuyor mu? Kodunuzun artık referans göstermediğinden emin misiniz? –

+0

Var html yalnızca bu işlevin kapsamına sahiptir ve başka hiçbir yerde kullanılmaz. Olumluyum, hiçbir yere başvurmuyorum. Bu benim ilk sızıntım olacak ve sanırım HtmlAgilityPack arka uç ile yapmak zorunda olabileceğini düşünüyorum. @EricJ. –

+0

Bunu basit bir test programında yeniden üretebilir misiniz? Html Çeviklik Paketinin sızdırdığını bulmak için şaşırırdım. Uzun süren bir programda (bir kerede günlerce çalışan web tarayıcım, dakikada binlerce sayfa indiriyorum) kullanıyorum ve herhangi bir sızıntı fark etmedim. –

cevap

2

Aynı problem yaşadım. Belgeyi işledikten sonra, belge örneğini null'a ve ardından GC.Collect() öğesine ayarlayın. Problem çözüldü.

+0

GC.Collect'i aramak iyi bir fikir değil. http://programmers.stackexchange.com/questions/276585/when-is-it-a-good-idea-to-force-garbage-collection –

+0

+1 hayır, iyi bir fikir değil (aslında nadir bir durum) sorunlara neden olan bir dll ile karşılaştığı zaman bu benim için sabit. Benim durumumda 300.000 belgeden metin çıkarmak istedim ve bu ağrımdaki tek yoldu. – Rippo

1

LoadHtml() numaralı telefonu kullanmaya yönelik HtmlAgilityPack.HtmlDocumentLoad() yöntemini kullanmayı deneyin.

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 
İlgili konular