Я работаю в агентстве общественного здравоохранения, у которого есть множество различных демографических наборов данных, хранящихся в серверах SQL, Access и Excel. Я написал приложение, которое позволяет людям находить «совпадения» в этих наборах данных на основе различных критериев, настроенных с помощью графического интерфейса пользователя. Например, одним «соответствием» может быть то, что First, Last и DOB совпадают в обоих наборах данных, но SSN «выключен на 1» (определяется алгоритмом Левенштейна).
Это большие наборы данных. Критерии соответствия могут быть действительно сложными. Прямо сейчас я нахожу совпадения, перетаскивая оба набора данных в таблицы данных в памяти, а затем перебирая строку за строкой в первой таблице и проверяя, есть ли какие-либо строки во второй таблице, которые совпадают (используя LINQ). Так что мой код выглядит примерно так:
For each table1Row in TableOne/DatasourceOne
table2Options=from l in table2rows where Levenshtein(table1Row.first, l.first)<2 //first name off by one
table2Options=from l in table2rows where Levenshtein(table1Row.last, l.last)<2 //last name off by one
if table2Options.count>1 then the row in table1 'matches' table 2
Next
Код выдает правильный вывод (находит совпадения), но он МЕДЛЕННЫЙ. Я знаю, что построчно работать медленнее, но использование LINQ для одновременного поиска всех записей идет еще медленнее.
From l in table1, k in table2 where Levenshtein(l.first, k.first)<2 and Levenshtein(l.last, k.last)<2 select l //this takes forever because it calculates the function for l rows * k rows
Есть какие-нибудь идеи о том, как сделать это соответствие ядра быстрее?