Как определить, блокируются ли потоки запросом PLINQ? - PullRequest
0 голосов
/ 09 марта 2019

Я пытаюсь найти совпадение Левенштайна между двумя наборами данных. Я пытаюсь найти расстояния редактирования ListA, который содержит тысячи значений, против другого ListB, который содержит миллионы записей.

До сих пор я достиг того, что я использую проекцию LINQ для получения перекрестного произведения пакетов значений из sourceDataBatch (500 batchsize) и TargetDataBatch (500000 batchsize), а затем запускаю параллельный запрос для получения продукта levenshtien. У меня 8-ядерный процессор, и запрос работает нормально, когда я обрабатываю список 1,5 КБ с 4,3 млн записей Но если я увеличу размер списка до 2K, он полностью прекратится. Я полагаю, что потоки блокируются после обработки 1,5К записей.

Пожалуйста, сообщите, что происходит в этом сценарии.

Это мой код:

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();

Вот мой метод Левенштиена:

 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;
 }
...