如何解决主内存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树。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。