Вы можете просто отсортировать записи по ключу и выполнить бинарный поиск.
Ключи фиксированного размера и записи данных означают, что вы можете очень быстро переходить от строки к строке, а хранение только ключа и данных означает, что вы не тратите место на метаданных.
Не думаю, что вы лучше справитесь с дисковым пространством, и время поиска равно O (log (n)). Время вставки сумасшедшее долго, но вы сказали, что это не имеет значения.
Если вы действительно хотите терпеть длительное время доступа, выполните сортировку таблицы, но затем разбейте ее на блоки определенного размера и сожмите их. Сохраните смещение * и клавиши начала / конца каждого блока в разделе файла в начале. Используя эту схему, вы можете найти блок, содержащий нужный вам ключ, за линейное время, а затем выполнить бинарный поиск в распакованном блоке. Выберите размер блока в зависимости от того, сколько файлов вы хотите загрузить в память за один раз.
Используя готовую схему сжатия (например, GZIP), вы можете настроить степень сжатия по мере необходимости; большие файлы, вероятно, будут иметь более быстрое время поиска.
У меня есть сомнения, что экономия пространства будет такой большой, так как ваша структура в основном состоит из хэшей. Если они на самом деле хэши, они случайные и не будут сжиматься ужасно. Сортировка поможет увеличить степень сжатия, но не на тонну.
* Используйте заголовок для поиска смещения блока, который нужно распаковать и использовать.