問題タブ [concurrenthashmap]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - ConcurrentHashMapの範囲を理解しようとしています
はConcurrentHashMap
スレッドセーフを提供しますが、ドキュメントの状態は次のとおりです。
「ただし、すべての操作はスレッドセーフですが、取得操作にはロックは必要ありません」
したがって、これから、キーと値の取得または設定はスレッドセーフであることがわかりますが、特定のキーの実際のVALUEを変更することはそうではありません(値によって、実際にはそのオブジェクトの値または状態を意味します)。
私はこれがどのように機能するかについて混乱しています。現時点では、このように機能すると思います。
キーのConcurrentHashMap
唯一の保証は、キーの設定/取得に関してスレッドセーフです。ただし、マップ内に配置したオブジェクトは、それ自体で並行性を確保する必要があります。
これは正しいです?
singleton - EJB3 シングルトン セッション Bean と ConcurrentHashMap
EJB3 シングルトン セッション Bean を使用している場合、ConcurrentHashMap 状態変数を使用しても意味がありません。正しいですか? Container Concurrency Manager によって管理される通常の HashMap を使用できますか?
java - put メソッドの呼び出し時に ConcurrentHashMap が null 以外のキーと値のペアを挿入しない
ConcurrentHashMap を使用して、SocketChannel で処理しているタスクをキャッシュしています。StreamTask は、クライアント サーバー通信中にラウンド トリップしきい値が経過した場合に自身を再スケジュールするために使用される Runnable であるため、時間が経過するとキャッシュから自身を削除します。さらに、StreamWriteTask スレッドはそれをキャッシュに置き、StreaReadTask はそれを削除しようとします。
問題は、「processingCache.put()」を呼び出すと、常にマップに追加されるとは限らないことです。
java - コード固有の機能概念を理解する
私はstrutsとjavaに比較的慣れていません。私は次のコードを理解しようとしています。
「PRDCT_SVC_IND」の周りのコードブロックに関連して、列の名前はどのようにlabelvaluebeanにマップされますか?
並行マップとキーと値のペアの機能については考えていますが、ここでの概念のほとんどについてはかなり確信が持てず、運が悪かったのでインターネットで検索しようとしました。コンカレントハッシュマップ、リスト(labelvaluebean)など、ここで使用されている概念の観点から、上記の行が実際に何を意味するのか(もちろん一般的に)、より明確な概要が必要です。入力をいただければ幸いです。
java - ConcurrentHashMap メモリ オーバーヘッド
ConcurrentHashMap のメモリ オーバーヘッドを (「従来の」HashMap と比較して) 知っている人はいますか?
- 工事中?
- 要素の挿入時?
multithreading - TBB ThreadingBuildingBlocks の奇妙な動作
私の質問: 「読み取り専用」の const_accessors を使用すると、プログラムがフリーズするのはなぜですか?
API の説明から、1 つのアクセサーと複数の const_accessors (ライター、リーダー) を持つことは問題ないようです。誰かが私に別の話をしてくれるかもしれません。
私が達成しようとしている目標は、この同時ハッシュ マップを使用し、10 ~ 200 のスレッドで利用できるようにして、情報を検索および追加/削除できるようにすることです。私が現在使用しているソリューションよりも優れたソリューションがある場合は、代替案を投稿してください。
TBB コミュニティ チュートリアル ガイドページ 43 では、アクセサの概念について説明しています。
java - Java ConcurrentHashMap の破損した値
時々奇妙な動作を示す ConcurrentHashMap があります。
アプリの初回起動時に、ファイル システムからディレクトリを読み取り、ファイル名をキーとして使用して各ファイルの内容を ConcurrentHashMap に読み込みます。一部のファイルは空である可能性があり、その場合は値を「空」に設定します。
すべてのファイルがロードされると、ワーカー スレッドのプールが外部要求を待ちます。リクエストが来ると、getData() 関数を呼び出して、ConcurrentHashMap にキーが含まれているかどうかを確認します。キーが存在する場合は、値を取得し、値が「空」かどうかを確認します。value.contains("empty") の場合、"ファイルが見つかりません" を返します。それ以外の場合は、ファイルの内容が返されます。キーが存在しない場合は、ファイル システムからファイルをロードしようとします。
場合によっては、ConcurrentHashMap は空でないファイル (つまりvalue.contains("empty") == false
) の内容を返しますが、次の行:
FALSE を返します。IF ステートメントを と の 2 つの部分に分けましif (reply != null)
たif (!reply.contains("empty"))
。IF ステートメントの最初の部分は TRUE を返します。2 番目の部分は FALSE を返します。そこで、文字列の内容に実際に「空」が含まれているかどうかを判断するために、変数「reply」を出力することにしました。これは事実ではありませんでした。つまり、内容に文字列「empty」が含まれていませんでした。さらに、行を追加しました
印刷したときに変数の応答に文字列「empty」が含まれていなかったので、indexOf
-1 が返されることを期待していました。しかし、関数は文字列の長さ、つまり に近い値を返しif reply.length == 15100
、その後reply.indexOf("empty")
15099 を返していました。
この問題は毎週、週に約 2 ~ 3 回発生します。このプロセスは毎日再開されるため、ConcurrentHashMap は定期的に再生成されます。
Java の ConcurrentHashMap を使用しているときに、そのような動作を見た人はいますか?
編集
java - Javaでの同時双方向マップ
テキスト処理用のコードを書いていますが、最初に文字列を整数に変換すると、処理がずっと速くなります。これを行うために、Dictionary クラスを作成しました。新しい文字列が表示されるたびにインデックスを付け、文字列から int へのマップと int から文字列へのマップの 2 つのマップを保持するので、両方の方法で簡単に検索できます。 . コードは次のとおりです。
これは、私のシングルスレッドコードでうまく機能しています。しかし、今はこの複数のスレッドを使用して速度を上げたいと思っていますが、その方法がわかりません。ConcurrentHashMap を使用することを考えputIfAbsent
ましたが、インデックスを 2 回使用しないことが保証されるかどうかはわかりません。Collections.synchronizedMap を使用したくありませんでした。このディクショナリはスレッド間で非常に頻繁にアクセスされるため、読み取りと書き込みのたびにブロックされるため、単一のスレッドよりもはるかに優れているとは思われません。これを機能させる方法はありますか?
c++ - gcc std::unordered_map の実装は遅いですか? もしそうなら - なぜですか?
私たちは、C++ で非常にパフォーマンスが重要なソフトウェアを開発しています。そこでは、並行ハッシュ マップと実装されたハッシュ マップが必要です。そのため、同時ハッシュ マップが と比較してどれだけ遅いかを把握するためのベンチマークを作成しましたstd::unordered_map
。
しかし、std::unordered_map
信じられないほど遅いようです...これが私たちのマイクロベンチマークです(並行マップでは、ロックが最適化されないようにするために新しいスレッドを生成しましたgoogle::dense_hash_map
。 null 値が必要です):
(編集: ソースコード全体はここにあります: http://pastebin.com/vPqf7eya )
の結果std::unordered_map
は次のとおりです。
の場合google::dense_map
:
手動でバックアップされた同時実行マップの場合 (ベンチマークはシングル スレッドですが、ロックを行いますが、別のスポーン スレッドにあります):
pthread サポートなしでベンチマーク プログラムをコンパイルし、メイン スレッドですべてを実行すると、ハンド バッキングされた同時実行マップで次の結果が得られます。
次のコマンドでコンパイルします。
したがって、特に挿入はstd::unordered_map
非常にコストがかかるようです.35秒対他のマップの3〜5秒. また、検索時間もかなり長いようです。
私の質問:これはなぜですか?誰かが尋ねるスタックオーバーフローに関する別の質問を読みました。なぜstd::tr1::unordered_map
彼自身の実装よりも遅いのですか。最も評価の高い回答では、std::tr1::unordered_map
より複雑なインターフェイスを実装する必要があることが示されています。しかし、私はこの引数を見ることができません: 私たちは、concurrent_map でバケット アプローチを使用し、バケット アプローチもstd::unordered_map
使用します (google::dense_hash_map
そうではありませんが、std::unordered_map
ハンドバックされた同時実行セーフ バージョンよりも少なくとも同じくらい高速である必要がありますか?)。それとは別に、ハッシュマップのパフォーマンスを低下させる機能を強制するインターフェイスには何も表示されません...
std::unordered_map
だから私の質問:非常に遅いように見えるのは本当ですか?いいえの場合: 何が問題なのですか? はいの場合:その理由は何ですか。
そして私の主な質問: 値を非常に高価なものに挿入するのはなぜstd::unordered_map
ですか (最初に十分なスペースを確保しても、パフォーマンスはそれほど向上しません。したがって、再ハッシュは問題ではないようです)。
編集:
まず第一に:はい、提示されたベンチマークは完璧ではありません-これは、私たちがそれでたくさん遊んだためであり、単なるハックです(たとえば、uint64
intを生成する配布は実際には良い考えではなく、ループで0を除外しますちょっとばかげているなど...)。
現時点では、ほとんどのコメントが、十分なスペースを事前に割り当てることで unordered_map を高速化できると説明しています。私たちのアプリケーションでは、これはまったく不可能です。データベース管理システムを開発していて、トランザクション中にデータを格納するためにハッシュ マップが必要です (ロック情報など)。したがって、このマップは、1 (ユーザーが 1 つの挿入とコミットを行うだけ) から数十億のエントリ (完全なテーブル スキャンが発生した場合) まで、あらゆる可能性があります。ここで十分なスペースを事前に割り当てることはまったく不可能です (そして、最初に大量に割り当てるだけでは、大量のメモリが消費されます)。
さらに、質問を十分に明確に述べていなかったことをお詫びします。 unordered_map を高速化することにあまり興味がありません (Google の密なハッシュ マップを使用すると問題なく動作します)。この大きなパフォーマンスの違いがどこから来るのかがよくわかりません。 . 単なる事前割り当てではありません (十分な事前割り当てメモリがあっても、高密度マップは unordered_map よりも桁違いに高速です。手動でバックアップされた同時実行マップはサイズ 64 の配列で開始されるため、unordered_map よりも小さい配列になります)。
では、 のこの悪いパフォーマンスの理由は何std::unordered_map
ですか? または別の質問:std::unordered_map
標準に準拠し、(ほぼ) Google の密なハッシュ マップと同じくらい高速なインターフェイスの実装を作成できますか? それとも、実装者が非効率的な実装方法を選択することを強制する標準の何かがありますか?
編集2:
プロファイリングにより、整数除算に多くの時間が費やされていることがわかります。std::unordered_map
は配列サイズに素数を使用しますが、他の実装では 2 の累乗を使用します。なぜ はstd::unordered_map
素数を使用するのですか? ハッシュが悪い場合にパフォーマンスを向上させるには? 良いハッシュの場合、違いはありません。
編集3:
の数値は次のstd::map
とおりです。
Sooooooo: への挿入は、へのstd::map
挿入よりも速いのはなぜstd::unordered_map
ですか...つまり、WAT? std::map
より悪い局所性 (ツリー対配列) を持ち、より多くの割り当てを行う必要があります (挿入ごと対再ハッシュごと + 衝突ごとに最大 1 を加えたもの)、そして最も重要なのは、別のアルゴリズムの複雑さ (O(logn) 対 O(1)) です!
java - 同時HashMapイテレータ:スレッディングに対してどれほど安全ですか?
マトリックスの作成には同時ハッシュマップを使用しました。インデックスの範囲は100kです。40個のスレッドを作成しました。各スレッドは、マトリックスのこれらの要素にアクセスし、それに変更して、次のようにマトリックスに書き戻します。
スレッドセーフではありませんでした。値がnullとして返されることが多く、プログラムがクラッシュします。スレッドセーフにする他の方法はありますか?またはこれはスレッドセーフであり、他の場所にバグがあります。1つは、プログラムがシングルスレッドモードでクラッシュしないことです。