Как только вы решите использовать структуру данных на диске, это станет не столько вопросом C ++, сколько вопросом разработки системы. Вы хотите реализовать дисковый словарь.
С этого момента вы должны учитывать следующие факторы: каковы параметры вашего диска? это SSD? HDD? какова ваша средняя скорость поиска в секунду? У вас нормально с задержкой в 20 мсек - 10 мс для вашего метода Lookup()
?
Для дисковых словарей требуется случайный поиск диска. Такие поиски имеют задержку в десятки микросекунд для SSD и 3-10 мс для HDD. Кроме того, существует ограничение на количество таких запросов, которые вы можете совершить за секунду. Вы можете прочитать эту статью например. Процессор перестает быть узким местом, и IO становится важным.
Если вы хотите следовать этому направлению - есть современные библиотеки C ++, которые предоставляют хранилище значений ключей на диске (нет необходимости во внешней базе данных) или вы можете сделать что-то еще просто.
Если ваше приложение представляет собой пакетный процесс, а не серверную / пользовательскую программу, т.е. у вас есть еще один конечный поток элементов, которые вы хотите объединить со своим словарем, тогда я рекомендую прочитать о внешних алгоритмах, таких как Hash Join или MapReduce. В этих случаях можно организовать ваши данные таким образом, чтобы вместо одного огромного словаря по 24 ГБ вы могли иметь 10 словарей размером 2,4 ГБ и последовательно загружать каждый из них и присоединяться. Но для этого мне нужно понять, какую проблему вы пытаетесь решить.
Подводя итог, вам необходимо сначала спроектировать систему, прежде чем писать код решения. Использование mmap, попыток или других трюков, упомянутых в комментариях, является локальной оптимизацией (если вообще имеет место), вряд ли она изменит правила игры. Я бы не стал спешить изучать их, прежде чем делать вычисления обратно на конверте, чтобы понять основное направление.