4

私のJavaプログラムはjava.util.concurrent.Executorを使用して複数のスレッドを実行し、それぞれが実行可能なクラスを開始し、そのクラスでC:ドライブ上のコンマ区切りのテキストファイルから読み取り、行をループしてテキストを分割してフロートに解析します、その後、データは次の場所に保存されます。

static Vector
static ConcurrentSkipListMap

私の PC は Win 7 64 ビット、Intel Core i7、6 * 2 コアと 24GB の RAM を備えています。プログラムは 2 分間実行され、1700 個のファイルすべてを終了することに気付きましたが、CPU 使用率は 10% から 15% 程度しかありません。を使用して割り当てたスレッドの数に関係なく:

Executor executor=Executors.newFixedThreadPool(50);

Executors.newFixedThreadPool(500) では、CPU 使用率が向上したり、タスクを完了する時間が短くなったりすることはありません。ネットワーク トラフィックはありません。すべてがローカル C: ドライブにあります。より多くのスレッドを使用するのに十分な RAM があります。スレッドを 1000 に増やすと、「OutOfMemoryError」が発生します。

より多くのスレッドがより多くの CPU 使用率とより少ない処理時間に変換されないのはなぜですか?

編集:私のハードドライブはSSD 200 GBです。

編集:最終的に問題の場所が見つかりました。各スレッドは、すべてのスレッドで共有されるログ ファイルに結果を書き込みます。アプリを実行する回数が増えるほど、ログ ファイルが大きくなり、ログ ファイルが遅くなり、共有されているため、これが発生します。プロセスが確実に遅くなるため、ログ ファイルへの書き込みを停止すると、すべてのタスクが 10 秒で完了します。

4

3 に答える 3

4

これOutOfMemoryErrorはおそらく、メモリ使用量に対する Java の独自の制限によるものです。ここでいくつかの引数を使用して、最大メモリを増やしてみてください。

速度については、Adam Bliss が良い提案から始めます。これが何度も同じファイルである場合、複数のスレッドが同時に読み取ろうとすると、ファイルのロックをめぐって多くの競合が発生する可能性があると思います。スレッドが増えると、競合が増えることになり、全体的なパフォーマンスが低下する可能性さえあります。したがって、それを避けて、可能であればファイルを一度ロードしてください。大きなファイルであっても、24 GB の RAM を搭載しています。非常に大きなファイルを保持できますが、ファイル全体をロードできるようにするには、JVM の許容メモリを増やす必要がある場合があります。

複数のファイルが使用されている場合は、次の事実を考慮してください。ディスクは一度に 1 つのファイルしか読み取ることができません。したがって、複数のスレッドが同時にディスクを使用しようとしても、スレッドが処理に多くの時間を費やさない場合、おそらくあまり効果的ではありません。CPU 使用率が非常に低いため、スレッドがファイルの一部をロードし、バッファリングされた部分で非常に高速に実行され、ファイルの残りの部分がロードされるのを待つのに多くの時間を費やしている可能性があります。ファイルを何度もロードしている場合でも、それが当てはまる可能性があります。

要するに、おそらくディスク IO が原因です。スレッドがファイルの内容をあまり競合しないように、それを減らすために作業する必要があります。

編集:

さらに検討した結果、同期の問題である可能性が高くなります。結果リストに追加しようとしてスレッドが停止している可能性があります。アクセスが頻繁に行われると、オブジェクトのロックに関して大量の競合が発生します。各スレッドがその結果をローカル リスト (スレッド セーフArrayListではないなど) に保存し、すべての値を最終的な共有リストにチャンクでコピーして、競合を減らすことを検討してください。

于 2013-07-24T03:35:59.623 に答える
1

おそらく、CPUではなくIOによって制限されています。

ファイルを開いて読み取る回数を減らすことはできますか? おそらく一度開いて、すべての行を読み取り、それらをメモリに保持してから、それを繰り返します。

それ以外の場合は、より高速なハード ドライブの入手を検討する必要があります。SSD は非常に高速です。

于 2013-07-24T03:14:42.760 に答える
1

システム上でスレッドの優先度が低い可能性がありますか? その場合、スレッドの数を増やしても、CPU 使用率の増加には対応しません。プログラムに割り当てられた CPU スペースの量が別の場所で調整される可能性があるためです。

このようなことが発生する可能性のある構成ファイル/初期化手順はありますか?

于 2013-07-24T03:15:28.407 に答える