Оптимизация:
1) Посмотрите на ваши данные. Может быть, вы можете сделать несколько проверок, чтобы быстрее отсортировать недопустимые пары. Если длина Name
изменяется более чем на 10, вы можете проверить, больше ли разница между s.Lenght
и t.Length
, и сразу же вернуться на большое расстояние (может быть int.MaxValue или просто 100). Нет смысла вычислять расстояние, если оно все равно явно выходит за рамки.
2) Ищите небольшие оптимизации. Зацикливание дважды на 150 тыс. Строк означает 22,5 млрд. Итераций. Небольшие изменения могут иметь большой эффект. Вы можете попытаться кэшировать объекты строк и удалить ToString()
, используя метод Equals()
. Я думаю, что это будет быстрее, чем доступ к i-му элементу вашей таблицы данных 150000 раз.
for (int i = 0; i < dt1.Rows.Count; i++)
{
var outerRow = dt1.Rows[i];
for (int j = 0; i + 1 < dt1.Rows.Count; j++)
{
var innerRow = dt1.Rows[j];
if (Equals(outerRow["NUM"] == innerRow["NUM"]))
{
if (outerRow["Name"].ToString().LevenshteinDistance(innerRow.ToString()) <= 10)
{
Logging.Write(...);
}
}
}
3) Попробуйте уменьшить / разделить наборы данных. Выполните запрос, чтобы получить все возможные значения NUM
select distinct NUM from myTable
. Затем для каждого NUM
в вашем результате выполните исходный запрос, но с использованием условия where и выберите только имя: SELECT name from myTable where NUM = currentNum
.
Таким образом, вы не t have to compare the NUM row and you don
t выбираете нечетные данные. Ваш код может быть оптимизирован для выполнения только расстояния Левенштейна, но с использованием оптимизаций, указанных в 1 + 2.
4) Попробуйте другой подход, например, полнотекстовый поиск.
Я просто хочу решить подобную проблему, находя совпадения в таблице с 1,2 миллионами строк. Я использовал lucene.net , который дает мне результаты в реальном времени при поиске по одному или нескольким свойствам моих строк.
Они тоже работают на levenshtein, но, возможно, это быстрее, чем ваша реализация;) MSSQL Server также поддерживает полнотекстовый поиск.