Как сохранить хэш-таблицу в файле?

Как я могу хранить хэш-таблицу с отдельной цепочкой в файле на диске?

создание данных, хранящихся в хэш-таблице во время выполнения, дорого, было бы быстрее просто загрузить HT с диска...если только я смогу понять, как это сделать.

изменить: Поиск выполняется с помощью HT, загруженного в память. Мне нужно найти способ сохранить хэш-таблицу (в памяти) в файл в некотором двоичном формате. Так что в следующий раз, когда программа запускается, она может просто загрузить HT с диска в оперативную память.

Я использую C++.

6 ответов


какой язык вы используете? Общий метод состоит в том, чтобы сделать некоторую двоичную сериализацию.

хорошо, я вижу, что вы отредактировали, чтобы добавить язык. Для C++ есть несколько вариантов. Я считаю, что механизм сериализации Boost довольно хорош. Кроме того, на странице библиотеки сериализации Boost также описаны альтернативы. Вот ссылка:

http://www.boost.org/doc/libs/1_37_0/libs/serialization/doc/index.html


предполагая, что C / C++: используйте индексы массивов и структуры фиксированного размера вместо указателей и распределений переменной длины. Вы должны иметь возможность напрямую записывать() структуры данных в файл для последующего чтения()ing.

для чего-либо более высокого уровня: многие API более высокого языка имеют средства сериализации. Java и Qt/C++ оба имеют методы, которые спринт сразу на ум, поэтому я знаю, что другие тоже.


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


Ditch указатели для индексов.

это немного похоже на построение на диске чувак, который я сделал некоторое время назад. Что сделало это очень сладким, так это то, что он мог быть загружен непосредственно с mmap вместо чтения файла. Если хэш-пространство управляемо, скажем 216 и 224 записи, тогда я думаю, что сделал бы что-то вроде этого:

  • сохранить список свободных индексов. (если таблица пуста, каждый цепной индекс будет указывайте на следующий указатель.)
  • когда цепочка необходима, используйте свободное пространство в таблице.
  • Если вам нужно поместить что-то в индекс, который занят скваттером (переполнение из другого места) :
    • запишите индекс (назовем его N)
    • поменять местами новый элемент и скваттер
    • поместите скваттер в новый свободный индекс, (F).
    • следуйте цепочке по хэш-индексу скваттера, чтобы заменить N на Ф.
  • если у вас полностью закончились свободные индексы, вам, вероятно, нужна большая таблица, но вы можете справиться немного дольше, используя mremap для создания дополнительной комнаты после таблицы.

Это должно позволить вам mmap и использовать таблицу напрямую, без изменений. (страшно быстро, если в кэше ОС!) но вы должны работать с индексами вместо указателей. Это довольно жутко, чтобы иметь мегабайты, доступные в syscall-туда и обратно-время, и все еще это занимает меньше, чем в физической памяти, из-за подкачки.


возможно DBM может быть полезным для вас.


Если ваша реализация хэш-таблицы хороша, то просто сохраните хэш и данные каждого объекта - помещение объекта в таблицу не должно быть дорогостоящим, учитывая хэш, а не сериализация таблицы или цепочки напрямую позволяет варьировать точную реализацию между сохранением и загрузкой.