Я пытаюсь найти совпадение Левенштайна между двумя наборами данных. Я пытаюсь найти расстояния редактирования 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;
}