对于那些在无锁数据结构和基于磁盘的数据结构方面具有强大背景的人来说,我面临着一个有趣的挑战。
我正在寻找一种方法来在C ++中构建一个数据结构,以容纳不同数量的对象。
限制如下:
有什么建议吗?
我正在考虑使用类似B-Tree的东西,当需要分割节点和编写新数据,而不是将它们移动到文件末尾的新节点,然后只更新指向将驻留的节点的指针。在一些其他文件中(原始块将被标记为空闲并添加到freestore)
但是,如果我的映射文件大于32 / 64Kb,我会遇到问题。假设我希望它只能容纳100万个对象指针而不是4个字节/指针我得到400万个字节4 Megs ...(甚至超过10亿个对象......)这意味着映射文件不能以原子方式写入。
因此,如果某人对如何实施上述内容有更好的建议 - 甚至某些方向,我们将不胜感激。
据我所知,B-Tree的所有开源/商业实现都使用某种锁,我不能使用。
谢谢, 最大
答案 0 :(得分:3)
只是假设读/写是原子的,你不会走得太远 - 主要是因为它们不是,并且你最终会以一种会扼杀性能的方式模仿它。
听起来你想要研究MVCC,这是在设计无锁数据库时使用的非常标准的机制。基本概念是每次读取都会获得数据库的“快照” - 通常通过单独保留旧页面并仅对新页面执行任何修改来以无锁方式实现。一旦旧页面被读者使用完毕,它们最终会被标记为可重复使用。
虽然MVCC比CPU / RAM无锁结构更加复杂,但是一旦拥有它,许多相同的乐观无锁模式都适用于使用它。
答案 1 :(得分:1)
LMDB将毫无问题地完成所有这些工作。它是一个MVCC B +树,读者完全无锁。