2

いくつかのWebサイトにアクセスし、WebサイトのHTMLをXMLに変換し、XMLでいくつかのxqueryコマンドを実行し、最終的に結果をcsvに保存し、それをクラウドファイルストレージ(Amazon S3など)にアップロードするJavaプログラムがあります。

ここで、作業を複数のスレッドに分割して高速化したいと考えていますが、作業に最適なスレッドの数を決定するにはどうすればよいでしょうか?

さまざまなタイプの Amazon EC2 インスタンスに対して、許可する必要があるスレッドの数を決定したいと考えています...これを支援できるライブラリまたはフレームワークはありますか?

または、Amazon EC2 インスタンスでコードを手動で実行し、スレッド数を変更し続け、所要時間を測定する必要がありますか?

具体的には、すべてのスレッドを処理するのにかかる合計時間と、同時に実行できるスレッドの数とのバランスを保ちたいと考えています...そして、CPU/RAM 容量が異なるさまざまなサーバーでこの相関関係を明確に確認できれば、素晴らしい...アドバイス/ガイダンスをいただければ幸いです...

4

3 に答える 3

3

あなたが説明する作業のタイプは、ほぼ間違いなく I/O バウンドです。ほとんどの時間は、データがダウンロードまたはアップロードされるのを待つために費やされます。もしそうなら、あなたの目標は単にアップロード/ダウンロード帯域幅を最大限に活用することです.

その場合、スレッドの最適な数は、マシン上の物理コアの数よりも多くなります (これは、CPU バウンド プロセスの開始に適した場所です)。

この情報から、最適なスレッド数を判断するのは困難です。これは、ダウンロードする量とリンクの速度に依存するためです。パフォーマンスが低下し始めるまで、スレッド数を 2 倍にしてみてください。

于 2012-08-17T16:44:53.650 に答える
2

JHAT、MATなどを使用してシングルスレッドでアプリのプロファイルを作成し、実行するマシン構成に基づいてスレッドの数を決定する必要があると思います。それはあなたのスレッドがどれくらい高価であるかについてあなたに一般的な考えを与えるでしょう。次に、負荷テスト(10スレッドに対して10,000アイテムがキューに入れられるなど)を実行して、思いついた制限を検証し、それに応じて調整できます。

于 2012-08-17T16:33:43.250 に答える
1

使用可能な論理コアの数を見つけるには、次を使用できます。

int processors = Runtime.getRuntime().availableProcessors();

そして、その数で作成しますThreadPool。も参照してください:

Javaでのコア数の検索

Java:CPUコアに従ってスレッドをスケーリングする方法は?

于 2012-08-17T16:48:08.097 に答える