チャンクベースの分割、タスク キュー (例: ExecutorService
)、およびプライベート ハッシュ テーブルを使用して重複を収集します。
プール内の各スレッドは、オンデマンドでキューからチャンクを取得し、プライベート ハッシュ テーブル内の項目のキーに対応する値に 1 を追加します。最後に、それらはグローバル ハッシュ テーブルとマージされます。
最後に、ハッシュ テーブルを解析して、どのキーの値が 1 より大きいかを確認します。
たとえば、チャンク サイズが 3 でアイテムが次の場合:
1 2 2 2 3 4 5 5 6 6
プールに 2 つのスレッドがあるとします。スレッド 1 は 1 2 2 を受け取り、スレッド 2 は 2 3 4 を受け取ります。プライベート ハッシュ テーブルは次のようになります。
1 1
2 2
3 0
4 0
5 0
6 0
と
1 0
2 1
3 1
4 1
5 0
6 0
次に、スレッド 1 は 5 5 6 を処理し、スレッド 2 は 6 を処理します。
1 1
2 2
3 0
4 0
5 2
6 1
と
1 0
2 1
3 1
4 1
5 0
6 1
最後に、重複は 2、5、および 6 です。
1 1
2 3
3 1
4 1
5 2
6 2
これは、各スレッドのプライベート テーブルのためにある程度のスペースを占有する可能性がありますが、最後のマージ フェーズまでスレッドが並行して動作できるようにします。