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

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

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

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

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

Ответы

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

Отметьте указатели для индексов.

Это немного похоже на построение на диске DAWG, которое я сделал некоторое время назад. То, что сделало так мило, было то, что он мог быть загружен непосредственно с помощью mmap вместо чтения файла. Если хэш-пространство управляемо, скажем, 2 16 или 2 24 записи, то я думаю, что я сделал бы что-то вроде этого:

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

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

Ответ 5

Возможно, DBM может вам пригодиться.

Ответ 6

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