私は1つのプロデューサ、Mコンシューマスレッドパターンを持っています。プロデューサは、ディスクから未処理のドキュメントを読み取り、LinkedBlockingQueueに配置します。マルチスレッドJava正規表現
public String clearContent(String document) {
Pattern regex = Pattern.compile(pattern);
Matcher matcher = regex.matcher(document);
matcher.find();
....
}
public String removeHTML(String document) {
Pattern regex = Pattern.compile(pattern);
Matcher matcher = regex.matcher(document);
matcher.replaceAll("");
....
}
私が直面しています問題がある:各コンシューマスレッドはその後、parseDocクラスは次のパターンで約20メソッドのセットです
ParsedDoc article = parseDoc(rawDocument);
を生文書を受け取り、クラスを使用して文書を解析しますローカル(2コア)マシンでコードがかなり速く実行されることを確認します。しかし、私が8コアマシンで同じコードを実行すると、コンシューマーのパフォーマンスはほとんど低下してしまいます。私はjvmオプションを無駄に最適化しようとしました。正規表現の処理ステップを削除すると、8コアで予想されるx4のパフォーマンスが向上しました。だから問題は正規表現です。パターンはスレッドセーフであり、マッチャーはリセット()する必要があるかもしれません。しかし、問題は正規表現のバンクを(parseDocクラスで)M個のコンシューマ間でスレッドセーフであるように再設計する方法です。
任意の助けも
をいただければ幸いです
、タスク(すなわち、32/64ビット・ポインタ/参照)をポップ/プッシュするのにかかる時間は、キューからタスク&ので、競合を処理するのに要する時間よりもはるかに小さい、くらいです問題はありません。開発者が2つの整数を足し合わせたP-Cキューにジョブをプッシュしようとしているなら、それはうまく拡張できません。任意の合理的なデータセットのパターンマッチングは、プールへのスレッドオフには問題ありません。 –
一般的なブロッキングキューへのプッシュ/ポップよりも明らかに時間がかかるロードバランサの例はありますか?こんにちはエイドリアン。 –
私はロードバランサを正しく実装しているかどうかはわかりませんが、あなたの提案に従っています。残念ながら私は改善が見られません。実際、それは8コアマシンで悪化します。各スレッドはローカルのLinkedListキューを持ち、プロデューサスレッドはそのラインを読み込み、ロードバランシングを行い、各スレッドのキューにどれくらいの負荷がかかっているかを判断します。ノンブロッキングは各コンシューマスレッドの正しいデータ構造になっていますか? – Peyman