- 主题:有没有支持 COW 的 B+ 树实现?
我想在内存里面维护一个树型的数据结构。它的读比较多,但是写比较少,另外写的过程比较长。所以我希望能够实现 COW,写时启动事务,不影响其它客户端读树,直到 commit 时,再修改 B 树的根节点,代替成新树。
有这种现成的算法库吗?
--
FROM 183.253.147.*
你这不就是典型的双buffer修改吗?替换指针的时候用一个cas指令,然后延迟释放一下旧树不就完了?
【 在 hgoldfish 的大作中提到: 】
: 我想在内存里面维护一个树型的数据结构。它的读比较多,但是写比较少,另外写的过程比较长。所以我希望能够实现 COW,写时启动事务,不影响其它客户端读树,直到 commit 时,再修改 B 树的根节点,代替成新树。
:
: 有这种现成的算法库吗?
发自「快看水母 于 V2134A」
--
FROM 123.116.113.*
lmdb满足所有要求。
【 在 hgoldfish 的大作中提到: 】
: 我想在内存里面维护一个树型的数据结构。它的读比较多,但是写比较少,另外写的过程比较长。所以我希望能够实现 COW,写时启动事务,不影响其它客户端读树,直到 commit 时,再修改 B 树的根节点,代替成新树。
:
: 有这种现成的算法库吗?
: --
: 灭绝人性啊
:
:
: ..................
发自「今日水木 on iPhone 12」
--
FROM 114.92.118.*
这个需要 unix 的 fork 吧。和 redis 原理一样。但是我想要数据结构级的。
【 在 vanbas 的大作中提到: 】
: lmdb满足所有要求。
: 发自「今日水木 on iPhone 12」
--
FROM 183.253.147.*
Java 有个 COW 的 List, 它是真的在写前复制一份。但 B 树不需要复制完整的一份,写时部分复制的。我这个树结构比较大,我不想完整复制一份。
【 在 solrex 的大作中提到: 】
: 你这不就是典型的双buffer修改吗?替换指针的时候用一个cas指令,然后延迟释放一下旧树不就完了?
: 发自「快看水母 于 V2134A」
--
FROM 183.253.147.*
不需要fork。
不过他是个kv db,内部它帮你管理了b tree,同时基于cow支持transaction
【 在 hgoldfish 的大作中提到: 】
: 这个需要 unix 的 fork 吧。和 redis 原理一样。但是我想要数据结构级的。
: --
: 灭绝人性啊
发自「今日水木 on iPhone 12」
--
FROM 101.82.129.*
这个“延迟释放一下旧树”,延迟到什么时候合适?
怎么判断别人的人是否在读这个旧节点?
【 在 solrex 的大作中提到: 】
: 你这不就是典型的双buffer修改吗?替换指针的时候用一个cas指令,然后延迟释放一下旧树不就完了?
: 发自「快看水母 于 V2134A」
--
FROM 223.72.70.*
释放旧树的头节点时,就释放了无没有被引用的叶节点。
【 在 NewMonk 的大作中提到: 】
: 这个“延迟释放一下旧树”,延迟到什么时候合适?
: 怎么判断别人的人是否在读这个旧节点?
--
FROM 110.81.1.*
如果不用引用计数,最简单的办法是估计你最长的请求处理时间,然后再延长两三倍。
【 在 NewMonk 的大作中提到: 】
: 这个“延迟释放一下旧树”,延迟到什么时候合适?
: 怎么判断别人的人是否在读这个旧节点?
发自「快看水母 于 V2134A」
--
FROM 123.116.126.*