スポンサーリンク
スポンサーリンク

C#のDictionaryはマルチスレッドに弱いのでList<T>を使う

C#Visual Studio

C#のDictionaryはマルチスレッドに弱く、Add()をマルチスレッドで繰り返すと5万件程度で「IndexOutOfRangeException」が発生します。
List<T>ならマルチスレッドでAdd()を繰り返しても、1500万件程度まで「OutOfMemoryException」は発生しませんでした。
DictionaryのAdd()をlockで囲み、その部分だけシングルスレッドにすれば解消されますが、.Net2.0以上にはList<T>という、マルチスレッドに強く使い勝手も良い機能があるので、初めからDictionaryを使わずにList<T>で統一するのが望ましいです。
※.Net Core だと List<T> のAdd()もlockで囲んだ方が良さそう。

以下は実験した結果。

実験に使用したソース => Src実証実験をダウンロード

 

実証実験1(シングルスレッド)

DictionaryをシングルスレッドでAdd()し、「Key、Value」の文字数を横方向に爆発させた場合、「OutOfMemoryException」になる。

a、コード

b、結果

 

実証実験2(シングルスレッド)

DictionaryをシングルスレッドでAdd()し、「Key、Value」の要素数を縦方向に爆発させた場合、1000万件程度で「OutOfMemoryException」になる。

a、コード

b、結果

 

実証実験3(マルチスレッド)

DictionaryをマルチスレッドでAdd()し、「Key、Value」の要素数を縦方向に爆発させた場合、5万件程度で「IndexOutOfRangeException」になる。

a、コード

b、結果

 

実証実験4(マルチスレッド lock有り)

DictionaryをマルチスレッドでAdd()する際、Add()だけlockさせ、「Key、Value」の要素数を縦方向に爆発させた場合、1000万件程度で「OutOfMemoryException」になる。

a、コード

b、結果

 

実証実験5(List<T> マルチスレッド)

List<T>をマルチスレッドでAdd()し、「Key、Value」の要素数を縦方向に爆発させた場合、1500万件程度で「OutOfMemoryException」になる。

a、コード  

b、結果

 

コメント

タイトルとURLをコピーしました