0

現在、多数の URL を反復処理するアプリを作成しています。ソース コードをプルダウンし、要素 ID などの参照ポイントを使用して特定のデータを抽出します。

ソース コードは String オブジェクトにロードされ、参照ポイントの IndexOf を見つけて SubString を実行することによって処理されます。

問題は、String オブジェクトがガベージ コレクションのジェネレーション 2 であることです。これは、収集される前にしばらくメモリ内に留まることを意味します。つまり、より多くの URL にアクセスすると、アプリのメモリ使用量が増加し続けます。

アプリを実行して 25 個の URL を処理したところ、メモリ使用量が 300Mb に跳ね上がり、しばらくすると (ガベージ コレクションが起動した後だと思います)、メモリ使用量は 1Mb に戻りました。

データを抽出するために短時間だけデータが必要なので、これを行うためのより最適化された方法はありますか?

参照ポイントの途中で分離が発生する可能性があるため、ソースをチャンクで読み取ることはできないことに注意してください。

IE

...<a href="http://www.some-website.com/" id="link-I-need">Hyperlink</a>...

そのように分離することができます

...<a href="http://www.some-website.com/" id="link-] (End of first chunk) - (Start of second chunk) [I-need">Hyperlink</a>...
4

3 に答える 3

0

スコープ内に必要以上に長い文字列がないようにコードを記述した場合、CLRは適切なタイミングと見なすたびにコードを収集します。したがって、プログラムにメモリが必要な場合、CLRはそのメモリを使用可能にします。

時間に敏感な操作を行っていない限り、CLRがどのように機能し、いつクリーンアップするかは、ユーザーコードには関係ありません。

于 2012-10-10T12:23:28.920 に答える
0

HTMLパーサーなどの別の方法を検討しましたか?HTMLパーサーは、試行しているものよりも効率的である可能性があります。次の記事が役立つかもしれません:C#でHTMLを解析するための最良の方法は何ですか?

于 2012-10-10T13:33:34.947 に答える
-1

If you're not already, use a StringBuilder object and append to the builder instead of concatenating strings.

At the end of each processing iteration you can clear the StringBuilder and release the memory.

于 2012-10-10T12:21:46.640 に答える