1

エンティティの大規模なセットに対して反復を実行して、それらがどの程度一致しているかを確認しようとしています

私は最初に書いた(MatchDataは構造体のリストであり、GenerateMatchは2つのエンティティで操作を実行します)

for (int i = 0; i < count; i++)
  {
      for (int j = i + 1; j < count; j++)
      {
       MatchData.Add(GenerateMatch(i, j));
       Console.WriteLine("Stage :" + i + " ::: " + j);
      }
  }

これはうまくいきましたが、かなり遅かった

だから私はそれをに変更しました

Parallel.For(0, count, i =>
  {
   for (int j = i + 1; j < count; j++){
        MatchData.Add(GenerateMatch(i, j));
        Console.WriteLine("Stage :" + i + " ::: " + j);
        }});

これにより膨大なリストが得られることを無視すると、エラーが発生することがあります(常にではありません)。「容量が現在のサイズより小さかった」

並列ライブラリにかなり慣れていないので、私がやっていることはどんなポインタでもより良く実行できると思います(ThreadSafe?)

また、二次的な質問として、iが故障したときに完了したiの数をカウントするにはどうすればよいですか。ありがとう

4

1 に答える 1

2

コードのバグは、MatchDataへの同時アクセスです。考えられる解決策:

var matches =
from i in ParallelEnumerable.Range(0, count)
from j in ParallelEnumerable.Range(i+1, count - (i+1))
select GenerateMatch(i, j);

PLINQを使用するだけです。同期されたコレクションをそのように扱う必要はありません。

于 2012-05-18T11:03:01.643 に答える