Как сохранить хеш-таблицу в файле?
Как сохранить хэш-таблицу с отдельной цепочкой в файле на диске?
Генерация данных, хранящихся в хеш-таблице во время выполнения, является дорогостоящей, было бы быстрее просто загрузить 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
Если ваша реализация хеш-таблицы является хорошей, просто сохраните хэш и данные каждого объекта. Помещение объекта в таблицу не должно быть дорогостоящим с учетом хэша, а не сериализация таблицы или цепочки напрямую позволяет вам изменять точное реализация между сохранением и загрузкой.