2011-01-31 10 views
7

リストやセットで多数の要素(500k程度)を保持する必要があります。高性能のトラバーサル、追加、削除を行う必要があります。これはマルチスレッド環境で行われ、トラバーサルが開始された後の更新(弱く一貫性のある)、このシナリオに適したJavaコレクションは何か気にしません。この場合、適切なJavaコレクションは何ですか?

+0

追加または削除は、トラバース中に行われるのでしょうか、または常に最初/最後に行われますか?それは各走査の間に起こるか? –

+0

@Michael Borgwardt、それはとてもいい話です – bestsss

+0

他のスレッドがコレクションを処理している間に、1つまたは複数のスレッドが要素を追加/削除できます。だから私は弱く一貫したコレクションが必要です。 –

答えて

-1

は重複した項目ですか?

はい、セットは使用できません。それ以外の場合はSortedSetを使用できます。

+0

要素をソートすると、追加/削除に悪影響があります。ここでは注文は必要ありません。 – Nicolas

1

トラバーサル==読み取り、追加/削除==更新の場合、1つのコレクションが両方の操作に最適化されていることはよくありません。

しかし、あなたの最善の策はHashMapである可能性があります。

+0

HashMapはトラバーサルのために悪い* – bestsss

+0

私が言ったように、何も最適ではありません。 – duffymo

+0

java.util.HashMap(スレッドセーフではない)は、トラバーサルには悪いですが、リンクリストをトラバースするよりも悪いです(CPUキャッシュの特性が非常に悪い)[最近、多くのアルゴリズムのパフォーマンスはキャッシュミス彼らがいる傾向がある]。 LinkedHashMapはその点では少し優れていますが、スレッドは安全ではありません。 – bestsss

1

マルチスレッドを試すことができます - ので、j.u.concurrentを見てください。 ConcurrentHashMapがSetとして使用されている可能性があります。 add(x)の代わりにput(x、x)を使用してください。

1

追加や削除を頻繁に行う場合は、おそらく "リンクされた"ものが最適な選択です。このように、インデックスだけを追加/削除するたびに、配列全体を「移動」させる必要があるArrayListとは異なり、更新する必要があります。問題は、あなたがコレクションの聖杯を求めていることです。

the Concurrent Collectionsをご覧ください。

「トラバーサル」とはどういう意味ですか?

+0

そのようなコレクションには索引でアクセスすることには注意してください。 – Qwerky

+0

私の状況では、トラバース中のトラバースがコレクションの要素を(例えばforeachループのように)処理していますが、コレクションを変更しません。 ArrayListは複数のスレッドからアクセスされたときに同期する必要があるため動作しません。 –

0

リストの途中でアイテムをすばやく追加または削除する必要がある場合は、LinkedListを使用するとよいでしょう。マルチスレッド環境には、それを使用するには、このようにそれを同期する必要があります。

List l = Collections.synchronisedList(new LinkedList()); 
+0

トラバース全体を同期させない限り、トラバースすることはできません。トラバースとは、各ノードの500kとほぼ保証されたキャッシュミスをちょうど恐ろしい考えです。 – bestsss

3

は私が行う必要があり、リスト内の 要素(500K程度)の多数または セットを保持する必要があります高性能 トラバーサル、追加と削除。 ... これは、マルチスレッド環境


ConcrrentSkipListMapで行われます - それはリストではありませんが、リストのセマンティクスは、同時環境にほとんど役に立ちません。あなたが(コンパレータを介して、または外部の)いくつかの自然順序付けを必要とするので、あなたはキューの末端に追加/削除のみが必要な場合には、

をハッシュ介してアクセス可能なツリー似た構造にソート要素はなくなります - ConcurrentLinkedQueueを

中規模の競合でも、同期されたコレクションはマルチスレッド環境には適していません。また、トラバース操作全体でロックを完全に保持する必要があります。私は、ConcurrentHashMapに対しても助言したいと思います。最後に

:あなたは64 +のような本当のマルチCPUのために行くと高いテンションを期待している場合、自然順序は、リンク従わたくない:によるデータのサイズが大きいため、一方http://sourceforge.net/projects/high-scale-lib

+0

ConcurrentHashMapに裏打ちされたSetについて、この状況でConcurrentHashMapを使用しない理由Collections.newSetFromMap(新しいコンカレントハッシュマップ()); –

0

をデータをデータベースに格納することは可能ですか?そして、メモリコレクションをキャッシュとして使用します。

+0

あなたが詳しく説明できますが、これがどのように自分の問題を解決するのか分かりません。 –

関連する問題