10 個のスレッドと大量のテキスト データを処理するスレッドプールがありました。これらのスレッドを並行して実行していて、コア i7 vPro プロセッサの CPU リソースをフルに活用できません。誰か助けてください。CPU使用率を最大にしたい。
4 に答える
多くの場合、各スレッドで同じことを行う代わりに、個別のジョブを実行し、同期されたキューを使用して通信すると、より良い結果が得られます。すべての読み取り操作が 1 つのスレッドから実行されるようにアプリケーションを分割してみてください。次に、データがワーカー スレッドに渡されて処理され、別のスレッドが後処理 (存在する場合) を行います。このようなモデルは、はるかに多くの処理能力を使用し、作業を大幅に高速化することがあります。
ほとんどの場合、CPU 使用率よりも多くのオーバーヘッドがあります。
- これは、ファイルを読み取って文に分割するのに時間がかかるためである可能性があります。100% の CPU が表示されないため、これは私の推測です。
- タスクを開始して他のスレッドに追加するオーバーヘッドは、各タスクが行う作業の量よりも大きくなります。100% に近い CPU 使用率が期待できますが、速度は予想よりはるかに低くなります。1 つのスレッドを使用するよりも遅くなる可能性があります。
JVM がウォームアップされていない限り、これは複数のスレッドを使用するよりも大きな違いがあることに気付くかもしれません。(100 センテンス ファイルでは十分ではありません)
各スレッドがファイルを処理するだけでなく、ファイルから文を読み取ることになっている場合、この状況ではディスクがボトルネックになっていると思われます。通常、1 つのディスクからの並列読み取りは、1 つの順次読み取りに比べてパフォーマンスが低下します。
私の意見では、すべてを単一のスレッドに任せるか、少なくとも読み取りをシリアル化し、単一のプロデューサーと複数のコンシューマーのパターンを使用して文の処理のみを並列化する必要があります。
マルチスレッドには、タスクをジョブに分割し、ジョブをジョブキューに送り、ジョブをThreadPoolExecutor
実行させ、終了時に結果を結合することによるオーバーヘッドが伴います。ディスク アクセスや他の共有リソースによる競合がなくても、ジョブを 1 ミリ秒未満に細分化することはオーバーヘッドに見合わないことがわかりました。複数のソケットを持つ大規模なマシンで実行すると、キャッシュの一貫性のオーバーヘッドが増加するため、そのしきい値はさらに高くなります。