0

すべての要素をハッシュテーブルコレクションアクションに追加するこの単純な操作をマルチスレッド化するにはどうすればよいですか?

foreach (var x in listx) //List of x
{
    String temp1 = x.sc;
    String temp2 = x.key;
    Nullable<int> temp3 = x.val;

    if ((null != temp2) && (string.Empty != temp2) && (int.MinValue != temp3) && "Fetch" == temp1)
    {
        if (false == htTempVal.ContainsKey(temp2.Trim()))
            htTempVal.Add(temp2.Trim(), temp3);
    }
}
4

3 に答える 3

2

いくつかの簡単なパフォーマンスの改善:

(1) ループで temp2 をトリミングするのではなく、temp2 を割り当てるときに x.Key をトリミングします。

(2) htTempVal を HashSet にすることはできますか? HashSet は最適化されており、キーが存在するかどうかを確認する必要がなく、追加するだけで済みます。オブジェクトの GetHashCode をオーバーライドし、HashSet を使用することで、パフォーマンスが大幅に向上しました。

これらはマイナーで簡単ですが、おおよそ持っている場合。100 万レコードを超えると、パフォーマンスが低下し始める可能性があります。

于 2012-05-22T20:32:27.197 に答える
0

スレッドセーフなハッシュテーブルを見つけますか?

最初にアイテムを並べ替えてから、一意のアイテムのみを追加できますか?おそらく並列ソートがあります。その後、ContainsKey()テストをスキップできます。

または、とにかくそのテストをスキップして、エラーがある場合は無視してください。

最後に、100万個のアイテムがどのように遅くなる可能性がありますか?他に何かが起こっているに違いありません。

于 2012-05-22T22:18:33.870 に答える
0

ハッシュテーブルを。に置き換えて、このようにすることができますConcurrentDictionary。ただし、基本的にループでアトミック操作を実行しているだけなので、スピードアップが得られる保証はありません。

ConcurrentDictionary<String, Nullable<int>> htTempVal = 
           new ConcurrentDictionary<String, Nullable<int>>();

Parallel.ForEach (listx,
  x =>
  {
      String temp1 = x.sc;
      String temp2 = x.key.Trim();
      Nullable<int> temp3 = x.val;

      if ((null != temp2) && (string.Empty != temp2) && 
          (int.MinValue != temp3) && "Fetch" == temp1)
      {
          htTempVal.GetOrAdd(temp2, temp3);
      }
  });

ConcurrentDictionary.GetOrAddキーと値のペアが存在しない場合はアトミックにチェックして追加し、ディクショナリにすでに存在する場合は値を返します(無視できます)。

于 2012-05-22T22:28:07.430 に答える