如何确定线程是否被PLINQ查询阻塞?

时间:2019-03-09 14:46:21

标签: c# linq optimization plinq

我正在尝试在两个数据集之间找到一个Levenshtien匹配项。我试图找到一个包含数千个值的ListA与另一个包含数百万条记录的ListB的编辑距离。

到目前为止,我已经完成了一个工作,我使用LINQ Projection从sourceDataBatch(500 batchsize)和TargetDataBatch(500000 batchsize)获取值的批次的叉积,然后运行并行查询以获取levenshtien产品。我有一个8核处理器,当我处理有430万条记录的1.5K列表时,查询工作正常。但是,如果我将列表大小增加到2K,它将完全停止。我想线程在处理1.5K记录后被阻塞了。

请告知在这种情况下会发生什么。

这是我的代码:

var pairs = (from wordToMatch in currentSourceDataBatch
             from similarWord in currentTargetDataBatch//cross product
             select new LevenshtienInput { WordToMatch = wordToMatch, SimilarWord = similarWord });

 var matches = pairs.
               AsParallel().                                    
               Where(pair => IsLevenshteinMatch(pair, threshold)).
               ToList();

这是我的Levenshtien方法:

 private static bool IsLevenshteinMatch(LevenshtienInput pair, double threshold)
 {
   int leven = Levenshtein.Distance(pair.WordToMatch, pair.SimilarWord);
   int length = Math.Max(pair.WordToMatch.Length, pair.SimilarWord.Length);
   double similarity = 1.0 - (double)leven / length;
   if (similarity >= threshold)
   {
     pair.Similarity = similarity;
     return true;
   }
   return false;
 }

0 个答案:

没有答案