2010-11-29 10 views
15

私は、ハッシュセットに約700万の短い文字列を追加する単純なアプリケーションを持っています。場合によっては、Hashset.Add()への呼び出し中に例外が発生することがあります。System.Collections.Generic.HashSet`1.IncreaseCapacity():インデックスが配列の境界外にありました。ハッシュセットに追加するときにIndexOutOfRangeExceptionが発生する<T>

これは断続的な問題で、メモリに関連しているようですが、これは16 GBのwin2k8 R2サーバー上にあります。それ以外の多くの物理メモリは利用できません。何か案は?

+5

マルチスレッドを追加していますか? – herzmeister

+0

私はParallelizationを使用して4コアPCにint.MaxValue Guidsを追加するプロジェクトを作成しましたが、それは失敗していません。 –

+0

うん、それは問題だった。私は知っていたはずだった。ありがとうherzmeister – dcrobbins

答えて

35

HashSet<T>はスレッドセーフではありません。特に、マルチスレッドのシナリオでアイテムを追加して内部容量を増やさなければならない場合、状況が同期しなくなる可能性があります。

+3

+1 IndexOutOfRangeExceptionは、コレクションのAdd操作からスローされたときにランタイムスレッドの問題が存在するという明確な指標です。 –

5

HashSet<T>のインスタンスメソッドはスレッドセーフではありません。特に、一度に複数のスレッドで既存の配列の境界を超えてしまうような要素を追加しようとすると、セットのサイズと最後のインデックスを追跡するために使用されるインスタンス変数両方のスレッドでセットを更新できます。特に、最後のインデックス値が、第1のスレッドが宛先配列のコピーを完了する前に第2のスレッドによって更新される(値が大きい)場合、存在しないローカル配列の要素にアクセスしようとする可能性がある第2のスレッドによって割り当てられた要素の半分だけを保持するように割り当てられた。

関連する問題