我正在尝试在两个数据集之间找到一个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;
}