問題タブ [concurrentdictionary]
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.
c# - Parallel.ForEach スレッドを安全にするためのより良い方法は?
次のコードをスレッドセーフにしたいと思います。残念ながら、このコード内でさまざまなレベルでロックを試みましたが、成功しませんでした。スレッドセーフを達成できると思われる唯一の例は、ループ全体にロックを配置することです。これにより、Parallel.ForEach は foreach を使用するよりも速くなりません (おそらくさらに遅くなります)。コードはロックなしで比較的/ほぼ安全です。約 20 回の実行ごとに、geneTokens.Value[-1] キーと gtCandidates.Value[-1] キーの合計にわずかな変動が見られるだけです。
Dictionary はスレッドセーフではないことを認識しています。ただし、この特定のオブジェクトを ConcurrentDictionary に変更すると、ダウンストリームのパフォーマンスが大幅に低下します。特定のオブジェクトを変更するよりも、コードのこの部分を通常の foreach で実行したいと思います。ただし、個々の Dictionary オブジェクトを保持するために ConcurrentDictionary を使用しています。私もこの変更を試みましたが、人種の問題は解決しません。
これが私のクラスレベルの変数です:
Parallel.ForEach は次のとおりです。
c# - ConcurrentDictionary のロックオン値
Partition は私が作成した小さなクラスです。Partitions という名前の ConcurrentDictionary に存在する何千ものパーティションがあります。シリアル化の前に、特定のパーティションをロックし、いくつかの作業を行ってから、パーティションのロックを解除したいと考えています。
この間、他のスレッドはそのパーティションにアクセスできません。私のクラス Partition は参照型であるため、以下のコードのように単一の Partition オブジェクトをロックできるかどうか疑問に思っています。
これにより、以下のロック中に ConcurrentDictionary パーティション内の単一のパーティションからの他のスレッドがブロックされますか?
クラス レベルのロッカー オブジェクトを使用してロックしたくありません。私の考えでは、複数のスレッドが以下のコードを同時に実行できるようにする必要があります。ロックされている場合、特定のパーティションにアクセスできないはずです...
c# - このオブジェクトのAddOrUpdate()にFuncを実装するにはどうすればよいですか:ConcurrentDictionary>>
AddorUpdate
値がコレクションである場合に値を正しく更新できるように、ConcurrentDictionaryに実装するにはどうすればよいですか?
私の懸念は、TValueは参照型であるため、競合状態でTValueを複数回呼び出す状況に遭遇する可能性があることです。これを自分でテストしますが、構文が間違っているため、先に進むことができません。
これを機能させるには何を変更する必要がありますか?
c# - 制限されたBlockingCollectionsは追加中にデータを失う可能性があります
BlockingCollection(ConcurrentBag、50000)があり、コンシューマースレッドのConcurrentDictionaryで処理できるレコード数を最大化するために、プロデューサースレッドに50,000という非常に小さな境界容量を使用しようとしています。プロデューサーはコンシューマーよりもはるかに高速で、それ以外の場合はほとんどのメモリを消費します。
残念ながら、ConcurrentDictionaryのレコードの総数が、テストデータの実行時に50,000の制限付き容量を追加した後、必要な数よりも大幅に少なくなっていることにすぐに気付きました。BlockingCollectionの.addメソッドは、コレクションにaddを実行するスペースができるまで、無期限にブロックする必要があることを読みました。ただし、これは当てはまらないようです。
質問:
BlockingCollectionの容量が解放される前に呼び出されるaddが多すぎると、BlockingCollectionの.addメソッドは最終的にタイムアウトするか、サイレントに失敗しますか?
#1の答えが「はい」の場合、データを失うことなく境界容量を超えた後、何回追加を試みることができますか?
容量を待機/ブロックしている多くのBlockingCollection.add()メソッドが呼び出され、CompleteAdding()メソッドが呼び出された場合、それらの待機/ブロック追加は待機を続け、最終的に追加しますか、それともサイレントに失敗しますか?
c# - ConcurrentDictionary.AddOrUpdate()
ConcurrentDictionaryクラスでAddOrUpdate()メソッドを使用しようとしています。Updatepeiceに問題があります。コードは次のとおりです。
すでに存在するキーで辞書をヒットした場合、pListオブジェクトに含まれる3つの値を更新したいと思います。現時点では、最後の反復(p [2])のみが辞書で更新されています。私は何が欠けていますか?
c# - ConcurrentDictionary 内で AddOrUpdate を「キャンセル」するにはどうすればよいですか?
MSDN ドキュメントとこのブログを読みましたが、次のロジックが必要です。
のためにConcurrentDictionary<string,bool>
- 文字列が存在しない場合は追加し、追加
True
中にブール値を設定していることを確認してください - 文字列が存在する場合は、
True
それが false の場合にのみ bool を変更します。それ以外の場合は、更新をキャンセルします
私のユースケース
マルウェアをスキャンする DNS ドメインがいくつかあります。私がリアルタイムで取得するリストには重複がある可能性が高いです。DNS ドメインのリストを 100 以下のバッチで受け取ります。スキャンするドメインは 10,000 を超えます。
10,000 ドメインの反復ごとに 1 回だけ DNS ホストをスキャンしたいと考えています。Abool == true
は、現在スキャン中であり、先に進む前にタスクをキャンセルする必要があることを意味します。bool == false
エントリがない場合は、すぐにエントリを更新するか、できるだけ早く新しいエントリを作成する必要があることを意味しますbool==true
。
覚えておいてください...
AddOrUpdate は、.NET4 の TPL の多くの独立したスレッドから独立して呼び出されます。key
各スレッドは、ディクショナリの...に記載されている値で作業する必要があるか、次の値に進む必要があるかを決定する必要があります。1 つの「キー」だけが作業を行う必要があります。
更新が成功したか失敗したかを呼び出し元のスレッドに通知する必要があります。さらに、この回答によると、AddOrUpdate の関数が何度も呼び出されるようです。key
これは、呼び出しスレッドが作業をキャンセルするか続行するかについて混乱することを意味する可能性があると思います。(アクティブに作業できるスレッドは 1 つだけであることを覚えておいてくださいkey
呼び出しスレッドを混乱させる可能性のある同時更新の例
出力
質問
この「更新のキャンセル」機能を AddOrUpdate に追加するにはどうすればよいですか?
c# - Linq を使用して辞書を作成する
Linq を使用して a Dictionary
(またはさらに良い a ) を作成するにはどうすればよいですか?ConcurrentDictionary
たとえば、次の XML があるとします。
にロードされXDocument doc;
、ConcurrentDictionary<string, Info>
(キーは名前であり、Info
アドレスと平均を保持するクラスです。Info
現在、入力は私の関心事ではありません)、これを行うにはどうすればよいですか?
c# - 多数の同時辞書の集約/マージ
だから私はそのように定義された並行辞書を持っています
私はそれが少し複雑に見えることを知っていますが、構造は有効です...
今私の問題は、x個の異なるソースのこれらの辞書のインスタンスがx個あると言っていることです。統計的な目的で、同じ構造の1つの辞書にマージ/統合/集約する必要があります...
誰かが最善のアプローチについて何かアイデアはありますか?同じ構造の新しい辞書を作成できることはわかっています。統合される各辞書をループし、各レベルでそれらのキーなどの新しい辞書をチェックし、その決定の結果に基づいて追加または更新します...
しかし、それは私には少し扱いにくいようです...手を貸すことができるLINQの天才はいますか?
[注-重要な編集を1つ行っただけです-出力辞書は入力辞書とまったく同じ構造です]
c# - 私のコードがヒットすることはありますか?ConcurrentDictionary TryGetValue(..)
コンカレントディクショナリがあり、TryGetValueを試し、それが失敗するかどうかをテストする場合は、何かを行いますが、失敗しない場合、TryGetValue関数から取得される出力値は、TryGetValueを試す前の値と等しくなります。 、私は何か他のことをします。
私の質問は、(ConcurrentDicationaryの何もdefault(DateTime)に設定されないと仮定して)、2番目のifステートメントが実際に実行されるのでしょうか?それとも現在の状況を考えると不可能ですか?