0

ログ ファイルからパターンに一致する行を抽出しています。したがって、各ログ ファイルを、見つかったパターン行を結果ファイルに書き込む Runnable オブジェクトに割り当てました。(よく同期されたライター メソッド)

議論中の重要なスニペット:

ExecutorService executor = Executors.newFixedThreadPool(NUM_THREAD);


for (File eachLogFile : hundredsOfLogFilesArrayObject) {
executor.execute(new RunnableSlavePatternMatcher(eachLogFile));
}

重要な基準:

ログ ファイルの数は 20 のように非常に少ない場合もあれば、ログ ファイルの数が 1000 を超える場合もあります。一連のテストを Excel シートに記録しましたが、赤でマークされた結果が非常に気になります。

1. 作成されたスレッドの数が処理されるファイルの数と等しい場合、スレッドの数が処理されるファイルの数よりも少ない場合と比較して、処理時間は短くなると思います。起こりません。(私の理解が間違っていたら教えてください)

結果 :

結果

  1. 少数のファイルと数千のファイルに効率的な NUM_THREAD の値を特定したいと思います

質問 1 と 2 の回答を提案してください

ありがとう !チャンドル

4

5 に答える 5

3

プログラムが CPU バウンドではなく、(おそらく) IO バウンドであることがわかりました。

これは、10 スレッドを超えると、データを必要とするすべてのスレッドの要求された読み取りに OS が追いつくことができず、より多くのスレッドが一度に次のデータ ブロックを待機していることを意味します。

また、出力の書き込みは、プログラムの最大のボトルネックになる可能性があるすべてのスレッド間で同期されるためです (スレッドが出力を待機する時間を最小限に抑えるには、生産者と消費者のソリューションがここでの答えになる場合があります)。

最適なスレッド数は、ファイルを読み取る速度によって異なります (読み取る速度が速いほど、より多くのスレッドが役立ちます)。

于 2013-09-20T14:52:59.023 に答える
2

すべての処理能力を使用するには、2 つのスレッドで十分なようです。ほとんどの場合、2 つのコアとハイパー スレッディングを使用しています。

私のは Intel i5 2.4GHz 4CPU 8GB RAM です。この詳細は役に立ちましたか?

モデルによっては、2 コアとハイパースレッディングがあります。

生成されるスレッドの数が処理するファイルの数と同じであれば、処理時間は短くなると思いますが、

これによりオーバーヘッドが最大化されますが、既に持っているよりも多くのコアが得られることはありません。

于 2013-09-20T14:42:27.880 に答える