0

できるだけ早く作業を開始しようとしているプログラムがあります。このプログラムは、多数の異なる Web サイトをロードし、それらに対してスクレイピングを実行します。

以前は Forms.HtmlDocument を使用してスクレイピングを実行していました (基本的に WebRequests を使用してダウンロードし、WebBrowser コントロールを使用してドキュメントにプッシュします)。メインスレッドではないときに更新します。

そこで、HtmlAgilityPack を試してみることにしました。これを並列化できるのではないかと考えました。しかし、その後、次の投稿を読みました。

Parallel.For/ForEach を使用して最大のパフォーマンスを得るには? (演奏時間含む)

これは、実際にはあまりうまく並列化されていないことを示唆しています。

すべてのコードの変換には時間がかかります (癖と複雑さのため) - しかし、その価値があるかどうかを知りたいです。WebGet を使用しない (代わりに WebRequest を使用してストリームを取得し、AgilityPack にプッシュする) と、パフォーマンスが向上しますか? 現在、反復ごとに約 19 秒かかり、ほとんどの時間はページのダウンロードの待機に費やされています。

その他のアイデアは考慮されます。ありがとう。

編集: 私たちがここにいる間に、どちらの方法を使用しても速度が向上しますか (シングルスレッド環境でも?)

4

1 に答える 1

1

私の場合、htmlagilitypack は非常にうまく機能していました。大きな問題の 1 つは、可能な限り高速に実行されるスラップ アプリケーションを作成するときに上書きする必要がある RFC 準拠です。

1)メインメソッドの先頭にこれを追加します

System.Net.ServicePointManager.DefaultConnectionLimit = 100;

2) tpl ではなく、通常のマルチスレッド ライブラリで並列化します。

于 2012-05-21T13:01:53.030 に答える