2010-11-24 4 views
4

クイックマルチスレッド質問...複数のスレッドメモリ内の大きな辞書オブジェクトにアクセスする - ボトルネック?

私は、約20,000のアイテムを含むメモリ内の単一の辞書オブジェクトを持っています。このオブジェクトから読み込みを試みているスレッドが複数ある場合、ボトルネックが発生すると思いますか?

NET 3.5。 Dictionaryオブジェクトは読み込み専用です

辞書はReadOnlyなので、私は読み書きについては心配していません。

+0

FYI読み取り専用-プロパティを使用しようとします。//msdn.microsoft.com/en-us/library/dd287191 .aspx –

答えて

5

ボトルネックは発生しませんが、辞書はスレッドセーフではありませんので、期待した結果が得られない可能性があります。 .NET 4.0では、この目的でConcurrentDictionary<TKey, TValue>を使用できます。

読み込み専用辞書の場合は、並行読者がいるのはおそらく安全です。この辞書に静的なコンストラクタのデータを埋め込んで、書き込みが読み込みを妨げないようにしてください読もうとする。

1

No bottleneck that I can see from reading,しかし、私は列挙子の使用について疑問を抱いています。

私はこれをまだ証明されていない、しかし本能はあなたがやっているすべてを読んでやっていない場合は

+0

列挙子が正しく実装されていれば問題はありません。 IEnumeratorとIEnumerableを実装するためのガイドラインの1つは、シーケンスのコピーが作成され、次に反復処理されるということです。 –

+0

これは非常に悪い実装のように思えます。これは、使用されるメモリ/ストレージを複製するためです。特に大きな辞書や大きなキーを使用する場合。辞書にアクセスするスレッドごとにコピーを作成するのは正しいようですか? –

+0

IEnumerator/IEnumerableを実装するためのガイドラインです。私はそれらを作成せず、実際には.NETの列挙型がどのように実装されているか(私が間違っていない場合)です。 Brad Adamsのこの記事をご覧くださいhttp://blogs.msdn.com/b/brada/archive/2003/04/10/49957.aspx –

3

...いくつかの問題を引き起こす辞書キー列挙子MIGHTを使用して、私のマルチスレッド・アプリケーションに指示します辞書に書き込んだらうまくいくはずです。

この場合、スレッドの安全性は突然変異に多く適用されます。したがって、あなたが何らかの形で突然変異を起こしていなければ、あなたはいいです。

2

どのようなロックと書き込みが行われているかによって異なります。

同時に書いていないのであれば、ロックなしで読むことは安全だと思うし、実際のボトルネックはないと思います。しかし、これには明確な仕様はありません。

あなたが書き込み(したがってロック)を行う場合、それは他に何が起こっているかによって異なります。

+0

書き込みはありません。読書のみ。 –

1

辞書を初期化してから読み込み専用のままにしておきたい場合は、プレーンディクショナリを使用するとスレッドセーフではないためボトルネックがなくなり、スレッドの同期オーバーヘッドがなくなります。

実際に読み取り専用パターンをサポートしている場合は、読み取り操作のみをサポートするコンテナタイプクラスに辞書をカプセル化することをお勧めします。クライアントは、辞書に "書く"ことによって設計意図を覆すことはできません。

+0

したがって、2つのスレッドが辞書から同時に検索を試みると、もう一方を待つ必要はありませんか? –

+0

@マークそれは完全に正しいです。プレーンな辞書にはスレッドの同期がないので、スレッドはブロックせずに待ち状態で自由に実行できます。 –

+0

メモリの読み込みには何らかの競合が存在する必要がありますか?それとも、それは間違っていますか? –

-1

System.Threading.ReaderWriterLockを使用してください。 新しい辞書を作成します。 "グローバル"の場所をロックします。 を割り当てます。 ロックを解除します。

それだけでデータソースを使用すると、.NET 4を、使用している場合に使用... HTTP、

+0

私は有権者ではありませんが、 'ReaderWriterLock'は単純な古い' lock'よりも約15倍のオーバーヘッドを持っていると指摘しておきます。したがって、読者が著しくライター数を上回らない限り、ロックはかなりの期間保持されます。このタイプのロックはボトルネックになる可能性があります。ちなみに、 'ReaderWriterLockSlim'は' lock'のオーバーヘッドの約5倍です。 –

関連する問題