2011-10-11 10 views
5

私は、フォーラムWebサイトの個々のページを解析するために、html agilityパックを使用しています。したがって、解析メソッドは、引数として渡されたページリンク上のトピック/スレッドリンクをすべて返します。私はすべての解析されたページのこれらのトピックリンクをすべて1つのコレクションに集めます。彼らは私のDictionary既に閲覧URLの上にある場合ウェブページの解析を最適に並列化するにはどうすればよいですか?

はその後、私がチェックし、そうでない場合は、その後、私は新しいリストに追加し、UIは、基本的に作成された新しいトピック/スレッドでこのリストを示し、前回から

これらの操作はすべて独立しているように見えるので、これを並列化するにはどうすればよいでしょうか?

.NET 4.0のParallel.For/ForEachを使用する必要がありますか?

どちらの方法でも、各ページの結果を1つのコレクションに集めるにはどうすればよいですか?それとも必要ないのですか?

parseメソッドが完了したときにいつでも、私は集中型Dictionaryから読み込むことができますか?

このプログラムを4000ページで実行すると、90分かかるので、8つのコアすべてを使用して〜10分で同じタスクを完了できたらいいでしょう。

答えて

1

その後、私が既に閲覧しているURLの辞書に登録されているかどうかを確認し、そうでない場合は新しいリストに追加してUIにこのリストを表示します。前回以降作成されたスレッド。 これらの操作はすべて独立しているように見えるので、これを並列化する最良の方法は何でしょうか?

確かにParallel.For/ForEachを使用しても問題ありませんが、クローラの設計については少し考えてください。ほとんどのクローラは、クロールに複数のスレッドを専用にする傾向があり、各スレッドは、(おそらくWebRequest/WebResponseを使用して、あなたのケースで)ページをフェッチする責任があるページフェッチクライアントに関連付けられている私は、これらの論文を読んで推薦:

あなたがMercatorデザインを実装する場合は、簡単に4000ページが80秒でダウンロードされますので、毎秒50ページをダウンロードすることができるはずです。

どちらの方法でも、各ページの結果を1つのコレクションに集めるにはどうすればよいですか。

ダーリンのように結果をConcurrentDictionary<TKey, TValue>に保存できます。キーはリンク/ URLであるため、値に何も格納する必要はありませんが、URL-seen Testを実行している場合は、各リンク/ URLを整数にハッシュしてからキーとして格納し、値としてのリンク/ URL。

これは必須ではありませんか?

何が必要かを決めるのはあなた次第ですが、URLテストを実行している場合は、それが必要です。

parseメソッドが終了したときに、その中央辞書から読み込むことはできますか?

はい、ConcurrentDictionaryは複数のスレッドを同時に読み取ることができるため、問題はありません。リンクが既にクロールされているかどうかだけを確認したい場合は正常に機能します。

このプログラムを4000ページで実行すると、90分かかるので、8つのコアすべてを使用して〜10分で同じタスクを完了できたらいいでしょう。

クローラを十分にうまく設計すれば、平均的なデスクトップPCで約4000秒のページをダウンロードして解析することができます(すべてのリンクを抽出できます)。標準でC#WebRequestは、10 Mbps接続の4 GB i5 3.2 GHz PC上にあります。

+0

ありがとうございます、メルカトルの設計は少し複雑ですが、抽出されたすべてのリンクを 'ConcurrentDictionary'で収集し、その後、私が望む私の集中コレクションをチェックして新しいリンクを収集します'ConcurrentDictionary'を作るために、この手順を並行して行うこともできます。それは私が考えることができる最高です。 –

4

Parallel.For/ForEachConcurrentDictionary<TKey, TValue>と異なるスレッド間で状態を共有することは、これを実装する良い方法のようです。並行ディクショナリは、複数のスレッドからの安全な読み書きを保証します。

+0

ありがとうございます。ConcurrentDictionaryに解析ページのすべてのリンクを格納するか、メソッドがそのリンクを抽出するたびに、この集中コレクションがConcurrentDictionaryであるはずの新しいリンクを検索します。 –

関連する問題