2011-12-27 15 views
4

私はグーグルでこの質問を検索し、私が探しているものに似たものは見つかりませんでした。複数のスレッドでリストを実行するためにハッシュセットを分離

Personと呼ばれるオブジェクトがほとんどないHashSetが作成されました。これらのPersonを巨大なテキストで検索するために4〜5つのスレッドを設定する必要があります。スレッドは、ハードウェアの使い方を最適化するソリューションです。

このHashSetを分離して4つのスレッドを開始するにはどうしたらいいですか?私は新しいHashSetリストを作成し、この新しいハッシュセットを4で分割して新しいスレッドを作成しようとしました。

これは良い解決策に見えますが、それを行う良い方法はありますか?ハッシュセットを分割して、4〜5個の新しいスレッドに分割して送信するにはどうすればよいですか?

答えて

2

プロデューサ/コンシューマスキームを実装できます。単一のスレッドがハッシュセットから値を1つずつ読み込んでキューに入れ、複数のワーカースレッドによって処理されるようにします。 ExecutorServiceクラスを使用して、ワーカーを管理することができます。

編集:ここではあなたが何ができるかです:

は、あなたのワーカークラスを定義します。

ExecutorService s = Executors.newCachedThreadPool(); 
for(Person p: hashSet) { 
    s.submit(new Worker(p)); 
} 
+0

ExecutorServiceを実装するには、HashSetを分割してExecutorServiceクラスで実行する必要がありますか? –

+0

@Rodrigo Ferrari:そうです。また、一度に1つの値だけを送信することもできます。 ExecutorServiceは、スレッドがどのように作業を実行するかを管理します。 – Tudor

+0

このハッシュセットを分割してExecutorServiceに送信する簡単かつ高速な方法はありますか?サンプル?私は検索しましたが、どのように私はそれを初めて知っている、私は送信され、送信されたハッシュセットからのフィードバックを取得する方法がありません。これは良い使い方ですか? http://pcdtrabalhofinal.googlecode.com/svn/trunk/src/TestHash.javaありがとうございます。 –

1

考慮すべき物事のカップル:

メインスレッドで

public class Worker implements Runnable { 
    private Person p; 

    public Worker(Person p) { 
     this.p = p; 
    }  

    public void run() { 
     // search for p 
    } 
} 

1)同じハッシュを使用できます設定しますが、同期させる必要があります(呼び出しを​​ブロックで囲みます)。しかし、あなたがやっているのは、ハッシュで物事を探しているのであれば、マルチスレッド化されてもそれほどあなたを買わないでしょう。

2)HashSetを分割する場合は、キー範囲の分割を検討することができます。たとえば、名前を検索している場合、A-Fで始まる名前はHashSet1、G-L HashSet2などになります。このようにして検索を完全に並行させることができます。

+0

ええ、主な考え方は、アルファベット順にハッシュセットを分割し、長文のPersonクラスの属性名を検索することです。 –

1

Iteratorを使用してハッシュセットを反復処理します。 &を繰り返しながら、値をフェッチしてスレッドを作成して起動します。

エルス

あなたは同時タスクを並列に実行できるExecutorServiceのAPIを使用することができます。

2

HashSetへのアクセスはO(1)なので、複数のスレッド間で分割すると、それ以上高速化されません。検索のファイルを分割しようとする方がコストがかかります。しかし、その効率が十分であれば、1つのスレッドが最適になります。

マシン上のすべてのコアを使用すると、プログラムの速度が遅くなることがあります。マシン上のすべてのCPUを使い切りたい場合は、マシン上のすべてのCPUを使い切るだけのスレッドプールを作成することができます。

+0

これは処理プログラムで、ユーザービューで実行されます。マルチスレッドは、テキストでこれらのPerson名を検索するための高速化に役立ちます。 –

+0

@RodrigoFerrari各スレッドが1/nの作業をするように、スレッド間で作業を分割することを確認するキー。各スレッドでより小さいセットを使用すると、各スレッドがそれより速くなることは期待できません。 –

+0

検索をすばやく行うと、ボトルネックがIOになります。この場合、より多くのCPUより多くのIOハードウェアが必要になります。追加のスレッドがあれば、より多くのCPU、より多くのメモリ、ディスクIO、ネットワークIO、L3キャッシュなどが必要な場合に役立ちます。 –

関連する問題