Общие советы: уметь измерять улучшения! Без этого вы можете настроить все, что вам нравится, основываясь на советах от интернета, но все равно не получите оптимальной производительности. По сути, я говорю вам не доверять мне или кому-либо еще (включая себя), но измерять. Также подготовьтесь к измерению этого в реальном времени на производственных системах. Сравнительный тест может в некоторой степени помочь вам, но реальные схемы загрузки все еще различны.
Затем вы говорите, что операции выполняются исключительно в памяти, поэтому скорость не зависит от (сети или хранилища)Производительность IO. Два узких места, с которыми вы сталкиваетесь, - это пропускная способность процессора и оперативной памяти. Итак, чтобы поработать над правой частью, выясните, что является ограничивающим фактором. Обеспечение эффективности соответствующей части обеспечивает оптимальную производительность для ваших поисков.
Далее вы говорите, что выполняете двоичный поиск. В основном это означает, что вы делаете log(n)
сравнений, где каждое сравнение требует загрузки определенного элемента из стога сена. Эта загрузка, вероятно, проходит через все кэши, поскольку размер данных делает попадания в кэш очень маловероятными. Однако вы можете хранить несколько игл для одновременного поиска в кеше. Если затем вам удастся сначала запустить загрузку кэша для игл, а затем выполнить сравнение, вы можете сократить время простоя ЦП или ОЗУ, поскольку они ожидают выполнения новых операций. Это, очевидно, (как и другие) параметр, который необходимо настроить для системы, в которой он работает.
Еще больше, пересмотрите бинарный поиск. Бинарный поиск работает надежно с хорошей верхней границей для случайных данных. Если у вас есть какие-либо закономерности (то есть что-то неслучайное) в ваших данных, попробуйте использовать эти знания. Если вы можете приблизительно оценить местоположение искомой иглы, вы можете уменьшить количество поисков. Это в основном переносит работу с шины ОЗУ на ЦП, так что это опять же зависит от того, что является фактическим узким местом. Обратите внимание, что вы также можете переключать алгоритмы, например переходить от обоснованного предположения к бинарному поиску, когда у вас осталось меньше определенного количества элементов для рассмотрения.
Наконец, вы говорите, что у каждого узла есть полная копияваша база данных. Если каждому из N узлов назначается одна N-я база данных, это может улучшить кэширование. Затем вы сделаете один первый шаг в поиске элемента, чтобы определить узел, а затем отправите поиск ответственному узлу. В случае сомнений каждый узел все еще может обработать поиск как запасной вариант.