Несколько сотен МБ не могут содержать несколько миллиардов объектов, если каждый объект не является битом (который на самом деле не является объектом ИМХО).
Как бы я подошел к этому, чтобы использовать отображенный в памяти файл для сопоставления содержимого данных и создать свою собственную хеш-таблицу в другом отображаемом в памяти файле (который требует сканирования данных один раз для построения ключей)
В зависимости от структуры данных, стоит помнить, что произвольный доступ не самый эффективный способ кеширования данных, т. Е. В ваш кэш загружаются строки размером 64 байта (в зависимости от архитектуры), и если ваша структура не помещается в памяти таблицы на основе записей могут быть более эффективными.