主内存B +树的持久性策略

|| 我正在尝试使用C ++为键值对开发主内存索引。我需要确保崩溃后索引可以恢复。我正在使用在这里找到的CSB + -Tree实现(BSD许可证) 我面临的主要挑战是在重新实例化节点后维护父子关系数据。 我已经搜索了各种策略来将“树结构”保存到磁盘或从磁盘中恢复。他们之中有一些是: 将节点对象保存为Pre-order并为空的子指针写入NULL。 在写入时将IDS赋予节点并保存节点的ID而不是指针 到磁盘,然后在重新实例化期间使用ID解析指针。 保存时,使用文件偏移值(物理内存中的地址)而不是子节点的主内存地址。这可能意味着我必须从繁琐的工作中节省下来。 我也看了几个序列化库。 Google ProtocolBuffers和Boost序列化。 现在,实现中的“节点”具有许多指针变量。其中一些是指向其他节点的指针,而其他是指向“键值”的指针。下面的代码是简化版本,保留了本质。
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实例指定一个ID,并使用该ID来维持\“ children \”关系。如果可以采取更好的方法,我想提出一些建议。     
已邀请:
数据(键,值)对是否分别保存在磁盘上,还是需要将它们与索引一起保留?当数据在磁盘上时,您是将数据本身保留在内存中,还是仅驻留在索引存储器中?如果整个数据集都驻留在内存中,则根本不保留树结构。只需保存(键,值)对的有序列表,并在加载时重建树即可。我从未使用过该库,但是任何合理的B树实现都应该能够非常有效地从预先排序的记录流中构建内存中的B树。     

要回复问题请先登录注册