Комментарии 1
Ставьте изначально задачи правильно.
Что значит "загрузить всё с диска в ОЗУ-кэш"?
Если все ~10К словарей по 2 млн байт каждый (опять же, каких букв - весь английский алфавит, или из UTF-8?) то это 20 млрд байт ОЗУ без учёта индексной нагрузки в неассемблерных языках. Вы же указываете 16 ГБ оперативы, доступной в задаче.
Если загружать частично, и, так понимаю, значительно меньше, чем фул база, то при чём тут вообще 16 ГБ RAM, из которой будет неиспользована большая часть, так как задержки на подгрузках сведут на "нет" 8-ми потоковую зависимость (при 8-ми ядрах) и при условии использования HHD (опять же, в условиях не указан тип постоянного носителя - SSD, или ещё что быстрее, или просто сетевое хранилище)
Что значит "1 млн запросов в секунду"? Тоже "от балды" цифра?
8 ядер реагируют, грубо, на 3 млрд тактов генератора в секунду при 3 ГГц процессоре.
Итого, 24 млрд инструкций он способен исполнить в секунду.
Делим на 1 млн запросов, получаем, что за 3 000 инструкций, нужно:
0) Получить запрос (так понимаю, что из сетевого подключения, на который потребуется минимум 4 КБ на сокет и 10 КБ на обработку, примерно и минимально, итого 14 КБ * на 1 млн коннектов = 14 ГБ ОЗУ только на удержание соединений, и это теоретический минимум, на который, видимо, задействуется дополнительная память, необозначенная в "инстансе")
1) Чекнуть базу, размером в ~20 ГБ
2) Отработать с диском / хранилищем
3) Выдать результат в сокет - здесь много зависит от драйвера сетевой карты, от операционной системы и её API, сколько она сожрёт тактов, я хз, кроме этого, должна происходить иная работа с другими службами OS фонового режима
4) И всё это на одной машине, без горизонтального масштабирования.
5) Здесь ещё используются различные общеизвестные базы данных, которые тоже захотят себе часть ресурсов системы.
Крч, эта задача = херь собачья, отнимающая время просто так.
Если говорить о безумии, что вообще такая задача может потребоваться для решения каких-то непридуманных и несуществующих задач, то я бы просто держал все данные в минимум (навскидку) 128 ГБ ОЗУ, особо структурировав их, и актуализируя на самые быстрые хранилища, которые только придуманы человечеством, а для обработки использовал бы только ассемблер с ТОПовыми инструкциями предоставленного процессора.
Может моих знаний недостаточно, и на Хакатоне, каком-нибудь, норм пацаны делают такие проектики "на коленках" и за полчаса максимум, и на пеньках третьих, но, на мой взгляд, физику сложно обмануть, шаманов не существует.
Сконкретизируйте более точно, иначе разговор ниочём, а я сижу и потею, как лошара.
Как наиболее эффективно хранить и запрашивать сотни string-int словарей на одной машине. Часть 1