C#で、WebBrowserを使った簡単なアプリケーションを作成しています。
あるサイトのリンク先のページを次々に表示させ、内容をCSVにダウンロードしていくというものですが、リンク先のデータが大量になると、メモリ不足でエラーになってしまいます。
具体的には、表示させたURLのhtmlを、
C#
1HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 2doc.OptionAutoCloseOnEnd = false; 3doc.OptionCheckSyntax = false; 4doc.OptionFixNestedTags = true; 5doc.LoadHtml(webBrowser1.DocumentText);
このように読み込み、さらに読み込んだHTMLのテーブルの内容を、
C#
1HtmlAgilityPack.HtmlNodeCollection datas = 2 doc.DocumentNode.SelectNodes(@"//table/tbody/tr");
このように読み込み、
C#
1foreach (HtmlAgilityPack.HtmlNode datain datas) 2{ 3 4 HtmlAgilityPack.HtmlDocument tmp = new HtmlAgilityPack.HtmlDocument(); 5 tmp.LoadHtml(item.InnerHtml.ToString()); - ① 6 7 HtmlAgilityPack.HtmlNodeCollection tds = tmp.DocumentNode.SelectNodes(@"//td"); 8 9 (ここで読み込んだデータをファイル出力する。) 10 11}
読み込んだデータをノードの数分、このようにループさせているのですが、だいたい8000行ぐらいループすると、「型 'System.OutOfMemoryException' の例外が mscorlib.dll で発生しましたが、ユーザー コード内ではハンドルされませんでした。」というエラーが出ます。
一体このエラーは何なのでしょう?
このような状態なのですが、一体何をどうしたらいいのかという感じです。
一番怪しいのは、foreeachでループしている箇所ですが、何かいい改善策などはないものでしょうか?
ループが実行されるたびに、tmp = new HtmlAgilityPack.HtmlDocument();で新しいオブジェクトが作らて、その分メモリの空きが減ります。ループ処理の終わりにtmpを解放して空きメモリを増やせば問題ありませんが、オブジェクトを作り続ければ、そのうち空きメモリが無い(OutOfMemory)になります。 tmpをはじめとするメモリの解放をしていないのが原因だと思われますが、コードが示されていないので推測の域を出ません。(そのため、回答では無くコメントに書きました)
回答1件
あなたの回答
tips
プレビュー