Я пытаюсь разработать индекс основной памяти для пар ключ-значение с использованием C ++.Мне нужно убедиться, что индекс восстанавливается после сбоя.Я использую реализацию CSB + -Tree (лицензия BSD), которую я нашел здесь Основная проблема, с которой я сталкиваюсь, - это сохранение данных отношения родитель-потомок после повторного создания узлов.Я искал различные стратегии для сохранения и восстановления «древовидной структуры» на / с диска.Вот некоторые из них:
- Сохранение объектов узлов в предзаказе и запись NULLS для пустых дочерних указателей.
- Предоставление IDS узлам и сохранение идентификатора узла вместо указателя при записи на диск, а затем разрешение указателей во время повторного создания экземпляра с использованием идентификаторов.
- Использование значений смещения файла (адреса в физической памяти) вместо адресов основной памяти дочерних узлов при сохранении.Это может означать, что я должен спасти с листа.
Я также посмотрел несколько библиотек сериализации.Google ProtocolBuffers и Boost Serialization.
Теперь «узлы» в реализациях имеют ряд переменных-указателей. Некоторые из них являются указателями на другие узлы, тогда как другие являются указателями на «значения ключа».Приведенный ниже код является упрощенной версией, чтобы сохранить сущность.
struct NodeHead
{
NodeHead *null; // null indicates internal node
char *children; // ptr to children
NodeEntry entries[1]; // entry array
}
struct NodeEntry
{
uint16_t offset; // offset to NodeHead of the key in byte
uint8_t next; // index of the next entry; 0xff means null
uint8_t num; // [0]: number of entries in use
};
Я думал о записи значений записи непосредственно в данные для заголовка узла, а не о сохранении ссылки. И присвоении каждому экземпляру NodeHead идентификатора и использованиячтобы поддерживать «детские» отношения.Я хотел бы получить совет, если это можно сделать лучше.