C # Linq Performance с большим списком

1

У меня есть приложение, которое по существу принимает один список (представленный пользователем) и возвращает набор данных для каждого элемента в списке. Моя основная проблема заключается в том, что у меня есть большая коллекция, которую я сохранил в памяти, чтобы избежать необходимости запрашивать базу данных каждый раз, но мои запросы по-прежнему занимают почти 0,5 секунды, и это слишком долго.

Коллекция - почтовые индексы США и США и имеет почти 1 миллион записей. Список от пользователя - от нескольких десятков до нескольких тысяч записей, и мне нужно сделать это для каждого, поэтому он занимает много времени с большими списками. Вот запрос:

var resultList = PostalCodeList.Where(p => p.postalcode == userPostalCode).ToList();

В списке почтовых кодов также имеются другие соответствующие данные (страна, регион и т.д.), Которые также должны быть возвращены пользователю. Всего 5 полей. Все строки.

существует вероятность того, что данные организованы так, что для данного значения есть 2 результата, поэтому мне нужно учитывать это.

Любые идеи или предложения были бы замечательными. Благодарю!

  • 0
    как насчет показа запроса, который вы используете для заполнения и / или возврата данных, которые будет использовать список ... также вы проверили, оптимизирована ли база данных для этой конкретной таблицы (таблиц), есть ли индексы или отсутствуют индексы, которые необходимо быть добавлен .. и т.д ... ??
  • 0
    Я бы использовал Dictionary для хранения информации (вместо списка).
Показать ещё 6 комментариев
Теги:
linq
performance
list

1 ответ

3

Был ли запрос к повреждению базы данных, или вы кэшировали данные из страха перед БД? Если последнее, вы можете обнаружить, что отдельные запросы лучше подходят для ваших нужд и должны оптимизироваться только при запуске проблемы производительности базы данных.

Тем не менее, вы можете использовать ToList() без необходимости. Если все, что вы делаете с результатом, это foreach, то то, что вы сделали, перечисляет коллекцию дважды (один раз для ToList(), второй для foreach). Если возможно, удалите ToList() и вместо этого работайте прямо с результатом Where(). Если итерация вашего списка является основной накладной, вы должны найти, что это сокращает время поиска примерно в половине.

Помимо этого, как другие заявили в своих комментариях по вашему первоначальному вопросу, вы можете обнаружить, что переход на методологию, которая поддерживает быстрый поиск (то есть хешсет), является единственным способом полностью обойти время поиска O (n), с которым вы столкнетесь по мере роста коллекции.

  • 0
    И если бы они обнаружили, что база данных слишком медленная, я хотел бы знать, есть ли у них подходящие индексы в таблицах для запросов.
  • 0
    Хотелось бы, чтобы это было так, но я был в этом со всех сторон, о которых я могу думать. Кажется, что каждая опция базы данных слишком медленная для задачи (почти 45 секунд на 1000 записей) даже с индексами. Я попробую Hashset и посмотрю, какой прогресс мы можем сделать. Спасибо!
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню