2012-04-17 45 views
5

Tôi nhận thấy có vấn đề về bộ nhớ khi tôi rời khỏi ứng dụng của mình trong một thời gian dài. Tôi thực sự có được một ngoại lệ bộ nhớ. Tôi cố gắng tìm ra vấn đề là gì và tôi đã thất bại cho đến khi tôi để nó chạy lại và tôi nhận thấyCác vấn đề về bộ nhớ khi sử dụng HtmlAgilityPack?

Tôi bị rò rỉ trên đường dây này mọi lúc html.LoadHtml(a_few_k_of_html);. Tôi nghi ngờ HtmlAgilityPack bị rò rỉ. Tôi đã thử gói nó trong sử dụng và gọi vứt bỏ nhưng điều đó không tồn tại. Nó không chỉ xảy ra trên dòng đó mọi lúc nhưng tôi nhớ việc thay đổi một vài khu vực để sử dụng HtmlAgilityPack thay vì parsing html with regex

Làm cách nào để giải quyết vấn đề bộ nhớ này không sửa đổi chính HtmlAgilityPack?

+0

Mã của bạn có giữ lại tham chiếu đến kết quả của html.LoadHtml không? Bạn có chắc là mã của bạn không còn tham chiếu đến nó nữa? –

+0

V html chỉ có phạm vi của một hàm đó và không được sử dụng ở bất kỳ nơi nào khác. Tôi đang tích cực tôi không tham khảo nó bất cứ nơi nào. Điều này sẽ là rò rỉ đầu tiên của tôi và tôi nghĩ rằng nó có thể phải làm với phụ trợ HtmlAgilityPack. @EricJ. –

+0

Bạn có thể tái tạo điều này trong một chương trình thử nghiệm đơn giản không? Tôi sẽ ngạc nhiên khi thấy rằng Html Agility Pack bị rò rỉ. Tôi sử dụng nó trong một chương trình chạy dài (trình thu thập dữ liệu web của tôi chạy trong nhiều ngày tại một thời điểm, tải xuống hàng nghìn trang mỗi phút) và không nhận thấy bất kỳ rò rỉ nào. –

Trả lời

2

Tôi gặp vấn đề tương tự. Sau khi xử lý tài liệu tôi thiết lập thể hiện của tài liệu thành null và sau đó là GC.Collect(). Vấn đề đã được giải quyết.

+0

Tôi không nghĩ gọi GC.Collect là một ý tưởng hay. http://programmers.stackexchange.com/questions/276585/when-is-it-a-good-idea-to-force-garbage-collection –

+0

+1 không có ý tưởng hay của nó (trường hợp hiếm hoi của nó thực sự) nhưng khi phải đối mặt với một dll gây ra vấn đề này cố định nó cho tôi. Trong trường hợp của tôi, tôi muốn xóa văn bản khỏi 300.000 tài liệu và đây là cách duy nhất thông qua cơn đau của tôi – Rippo

1

Hãy thử sử dụng phương pháp HtmlAgilityPack.HtmlDocumentLoad() được insted sử dụng 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 
Các vấn đề liên quan