Как ускорить поиск в огромном словареC#

Место общения программистов C#
Ответить
Anonymous
 Как ускорить поиск в огромном словаре

Сообщение Anonymous »

У меня очень большой словарь, и содержимое внутри него выглядит следующим образом
(заголовки не включены в словарь):

Код: Выделить всё

(code)        (names)
------------------------------
910235487     Diabetes, tumors, sugar sick, .....
У меня в словаре более 150 тысяч строк таких пар.
Пользовательский ввод — ключевые слова (названия диагнозов), я не могу поиск по словарю по ключам.
Вот код:

Код: Выделить всё

var relevantIDs = this.dic.Where(ele => ele.Value.Contains(keyword))
.Select(n => Convert.ToUInt64(n.Key));
Словарем является Dictionary, и мне приходится использовать строку в качестве типа данных ключа, поскольку коды иногда могут содержать символы. Столбец имен содержит список соответствующих названий диагнозов. Поэтому я тоже не могу изменить этот тип данных.
Я думаю, проблема в том, что для каждого значения пары я выполнил операцию Содержит, которая замедляет процесс who, но я не могу найти альтернативный способ сделать это...
Это то, что я сделал, чтобы найти совпадающие коды.
Но производительность этот код ужасен (на завершение этой единственной строки кода уходит около 5 минут).
Может ли кто-нибудь помочь?
Обновите и самое простое решение
Я наконец-то нашел сезон, почему поиск такой медленный, и решил эту проблему:

Код: Выделить всё

var relevantStringIDs = this.dic.Where(ele => ele.Value.Contains(keyword)).Tolist();
var relevantUlongIDs = relevantStringIDs.Select(n => Convert.ToUInt64(n.Key)).Tolist();
Причина, по которой это было так медленно, заключается в this.dic.Where(ele => ele.Value.Contains(keyword)), он будет выполняться каждый раз, когда вторая часть запроса выполняется (это особенность IEnumerable, я забыл термин для нее (возможно, отложенное выполнение)). Поэтому я использую ToList() для преобразования отложенного запроса в конкретный список в памяти, чтобы результат можно было повторно использовать при преобразовании строк в ulongs, а не выполнять запрос заново для каждого преобразования.
Пожалуйста, поправьте меня, если вы нашли в этом объяснении что-то не так.
Кстати, хотя это, возможно, и не лучшее решение, но производительность измененного кода низкая. тихо, удовлетворительно. Первый оператор кода занимает всего 169 мс, что для меня достаточно быстро.

Подробнее здесь: https://stackoverflow.com/questions/176 ... dictionary
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»