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