リストやセットで多数の要素(500k程度)を保持する必要があります。高性能のトラバーサル、追加、削除を行う必要があります。これはマルチスレッド環境で行われ、トラバーサルが開始された後の更新(弱く一貫性のある)、このシナリオに適したJavaコレクションは何か気にしません。この場合、適切なJavaコレクションは何ですか?
答えて
は重複した項目ですか?
はい、セットは使用できません。それ以外の場合はSortedSetを使用できます。
要素をソートすると、追加/削除に悪影響があります。ここでは注文は必要ありません。 – Nicolas
トラバーサル==読み取り、追加/削除==更新の場合、1つのコレクションが両方の操作に最適化されていることはよくありません。
しかし、あなたの最善の策はHashMapである可能性があります。
はここにあなたのアプリケーションに応じて、コレクションを選択する上で非常に良い記事です
あなたはこれだけでなく
http://www.javamex.com/tutorials/collections/how_to_choose.shtml
マルチスレッドを試すことができます - ので、j.u.concurrentを見てください。 ConcurrentHashMapがSetとして使用されている可能性があります。 add(x)の代わりにput(x、x)を使用してください。
追加や削除を頻繁に行う場合は、おそらく "リンクされた"ものが最適な選択です。このように、インデックスだけを追加/削除するたびに、配列全体を「移動」させる必要があるArrayListとは異なり、更新する必要があります。問題は、あなたがコレクションの聖杯を求めていることです。
the Concurrent Collectionsをご覧ください。
「トラバーサル」とはどういう意味ですか?
そのようなコレクションには索引でアクセスすることには注意してください。 – Qwerky
私の状況では、トラバース中のトラバースがコレクションの要素を(例えばforeachループのように)処理していますが、コレクションを変更しません。 ArrayListは複数のスレッドからアクセスされたときに同期する必要があるため動作しません。 –
リストの途中でアイテムをすばやく追加または削除する必要がある場合は、LinkedListを使用するとよいでしょう。マルチスレッド環境には、それを使用するには、このようにそれを同期する必要があります。
List l = Collections.synchronisedList(new LinkedList());
トラバース全体を同期させない限り、トラバースすることはできません。トラバースとは、各ノードの500kとほぼ保証されたキャッシュミスをちょうど恐ろしい考えです。 – bestsss
は私が行う必要があり、リスト内の 要素(500K程度)の多数または セットを保持する必要があります高性能 トラバーサル、追加と削除。 ... これは、マルチスレッド環境
ConcrrentSkipListMapで行われます - それはリストではありませんが、リストのセマンティクスは、同時環境にほとんど役に立ちません。あなたが(コンパレータを介して、または外部の)いくつかの自然順序付けを必要とするので、あなたはキューの末端に追加/削除のみが必要な場合には、
をハッシュ介してアクセス可能なツリー似た構造にソート要素はなくなります - ConcurrentLinkedQueueを。
中規模の競合でも、同期されたコレクションはマルチスレッド環境には適していません。また、トラバース操作全体でロックを完全に保持する必要があります。私は、ConcurrentHashMapに対しても助言したいと思います。最後に
:あなたは64 +のような本当のマルチCPUのために行くと高いテンションを期待している場合、自然順序は、リンク従わたくない:によるデータのサイズが大きいため、一方http://sourceforge.net/projects/high-scale-lib
ConcurrentHashMapに裏打ちされたSetについて、この状況でConcurrentHashMapを使用しない理由Collections.newSetFromMap(新しいコンカレントハッシュマップ
をデータをデータベースに格納することは可能ですか?そして、メモリコレクションをキャッシュとして使用します。
あなたが詳しく説明できますが、これがどのように自分の問題を解決するのか分かりません。 –
- 1. このシナリオでは、どのスレッドセーフなコレクションが適切ですか?
- 2. バックボーンモデルコンストラクタの2番目の引数にコレクションを渡すことは適切な場合はありますか?
- 3. この場合、シングルトンは適切でしょうか?
- 4. アプリケーションログを保存する適切な場所は何ですか?
- 5. ModelForm検証を行う適切な場所は何ですか?
- 6. このコードの適切なラケット/スキームのイディオムは何ですか?
- 7. 適切なLLVMヘッダーガードスタイルは何ですか?
- 8. 不適切なリストは何ですか?
- 9. Rubyが適切な構造の場合
- 10. 私の場合、ベクトルがより適切なのですか?C++
- 11. リクエストに必要なCookieが見つからない場合は、適切なHTTPステータスコードは何ですか?
- 12. SQL:これに対して適切なクエリは何ですか?
- 13. 単純なファイルコピーのための適切なJava Configは何ですか
- 14. Statment適切な式がある場合
- 15. 必要なヘッダーがない場合に返す最も適切なHTTPステータスコードは何ですか?
- 16. レールアプリケーション用のWebサービスクライアントを作成する適切な場所は何ですか?
- 17. JavaからCURLを実行する - 適切な方法は何ですか?
- 18. Java Swing - ステージベースのGUIを実行する適切な方法は何ですか?
- 19. 例外の場合の "トランザクション処理"を保証するための適切なワークフローは何ですか?
- 20. サーブレットにファイルの場所を伝える適切な方法は何ですか?
- 21. この場合、最も適切なコンストラクタが呼び出されないのはなぜですか?
- 22. 多層アーキテクチャを使用する場合のメソッド呼び出しの適切なシーケンスは何ですか?
- 23. Java:多次元型、1次元型の適切な用語は何ですか?
- 24. Javaを書くための「適切な」形式とは何ですか?
- 25. Javascriptコレクションの適切な書式設定
- 26. この場合、__add__を適切にオーバーライドする方法はありますか?
- 27. ストアドプロシージャでこのエラーを処理する適切な方法は何ですか?
- 28. パイプをJavaパターン式に挿入する適切な方法は何ですか?
- 29. javaをjarにコンパイルするとき、適切なエントリポイントは何ですか?
- 30. バネ統合でXMLをJavaオブジェクトに変換する適切な方法は何ですか?
追加または削除は、トラバース中に行われるのでしょうか、または常に最初/最後に行われますか?それは各走査の間に起こるか? –
@Michael Borgwardt、それはとてもいい話です – bestsss
他のスレッドがコレクションを処理している間に、1つまたは複数のスレッドが要素を追加/削除できます。だから私は弱く一貫したコレクションが必要です。 –