Откажитесь от указателей на индексы.
Это немного похоже на создание на диске DAWG , которое я сделал некоторое время назад. То, что сделало это настолько приятным, было то, что он мог быть загружен непосредственно с mmap вместо чтения файла. Если хеш-пространство является управляемым, скажем, 2 16 или 2 24 записей, то я думаю, что я бы сделал что-то вроде этого:
- Вести список свободных индексов. (если таблица пуста, каждый цепной индекс будет указывать на следующий индекс.)
- Когда необходимо связывание, используйте свободное место в таблице.
- Если вам нужно поместить что-то в индекс, который занят скваттером (переполнение откуда-либо):
- записать индекс (назовем его N)
- поменяйте местами новый элемент и скваттер
- поместите скваттер в новый свободный индекс (F).
- следуйте по цепочке в хэш-индексе скваттера, чтобы заменить N на F.
- Если у вас закончились свободные индексы, вам, вероятно, понадобится таблица большего размера, но вы можете справиться немного дольше, используя mremap, чтобы создать дополнительное пространство после таблицы.
Это должно позволить вам отображать и использовать таблицу напрямую, без изменений. (Страшно быстро, если в кеше ОС!) но вы должны работать с индексами, а не с указателями. Довольно пугающе иметь мегабайты, доступные в режиме syscall-round-trip-time, и все равно иметь их меньше, чем в физической памяти, из-за подкачки.