B+树实现磁盘存储

2017-04-20 17:54:59 +08:00
 begeekmyfriend

三年前我就想写一个关系数据库了,无奈却苦于 B+树算法的实现,如今数据库仍旧没着落,但总算写出 B+树实现了磁盘落地。虽然只是个 demo ,但算法上保证完备,实践上经久耐操,对百万级样本处理达到秒级性能。附上源码以及测试用例(包括文件落地和读写),望数据库和存储大牛们切磋指教!

https://github.com/begeekmyfriend/bplustree

一种玩法: 随机生成一百万样本和四百万条 CRUD 指令,将结果存储到/tmp/data.bp/tmp/metadata.bp

./coverage_build.sh

退出后再次运行 demo ,读取默认保存的/tmp/data.bp/tmp/metadata.bp

./demo_build.sh

使用 dump 指令在终端上画出整个树形结构(见 help 输出)

注意:下次玩的时候记得更改文件名,否则会把文件中原有的数据读入

顺便说一句,代码质量基本属于principle(al)级别,电脑搞坏我全陪!

9305 次点击
所在节点    程序员
22 条回复
shoaly
2017-04-20 18:02:05 +08:00
样本在哪里?
shoaly
2017-04-20 18:02:18 +08:00
sorrry...........眼睛太瞎 找到了
svenFeng
2017-04-20 18:58:15 +08:00
。。。 B+树的索引有这么难么。。。感觉就是细节比较多吧
micyng
2017-04-20 18:59:04 +08:00
大概 1 个月前验证过楼主的代码,跟 http://www.cs.usfca.edu/~galles/visualization/BPlusTree.html 结果稍微有些不一样
svenFeng
2017-04-20 19:09:51 +08:00
丢一个自己写的垃圾 rdbms[sdb]( https://github.com/svenFeng/sdb/blob/master/readme.md)(逃
svenFeng
2017-04-20 19:12:11 +08:00
链接错了😂😂😂https://github.com/svenFeng/sdb
wlee1991
2017-04-21 02:38:47 +08:00
我不会再给任何公司工作。我会创造一个伟大的公司,它会创造世界上最精致的产品,它会给真正有价值的人相应的回报和尊重。

seriously ???
lbp0200
2017-04-21 08:18:20 +08:00
可以实现 nosql ,比如 key 、 value
begeekmyfriend
2017-04-21 09:30:46 +08:00
@micyng 主要还是节点分裂点的选择不一样,比如我一向是(len + 1) / 2 ,而他则有时这样,有时又是 len / 2 ,导致结构不一样,但不影响效果和效率。另外我仍然保留了内存版,你可以观察效果,并且随意设置节点大小,比如把叶子设置得比非叶子更大一点: https://github.com/begeekmyfriend/bplustree/tree/in-memory
begeekmyfriend
2017-04-21 09:40:50 +08:00
@lbp0200 nosql 原本不需要 B+树,你看 redis 实现过吗? B+树本来就是为 SQL 实现的,它比 B 树的优势在于范围查询更快,因为数据都在叶子节点上,所有的叶子节点又在同一底层上
begeekmyfriend
2017-04-21 10:00:15 +08:00
我在一篇博文 http://www.yinwang.org/blog-cn/2017/04/17/management-tricks 写到:“索引的存储又分为有序和无序,前者使用关联式容器,比如 B 树,后者使用哈希算法。这两类算法各有优劣:比如,关联式容器时间复杂度稳定 O(logN),且支持范围查询;又比如哈希算法的查询、增删都比较快 O(1),但这是在理想状态下的情形,遇到碰撞严重的情况,哈希算法的时间复杂度会退化到 O(n)。”

显然 nosql 一般使用的都是哈希一类数据结构,也可以用关联式容器,但从性价比上看,哈希表是最高的。
begeekmyfriend
2017-04-21 10:02:04 +08:00
抱歉,上楼链接放错了, V2EX 不支持删除啊: http://coolshell.cn/articles/17225.html
artandlol
2017-04-21 11:34:15 +08:00
“电脑搞坏我全陪 ” 好可怕 直男不好这口
AngelCriss
2017-04-21 17:28:27 +08:00
你这个有内存泄漏啊
begeekmyfriend
2017-04-21 17:47:03 +08:00
@AngelCriss 请给出证据,我使用 valgrind 跑过的
begeekmyfriend
2017-04-21 18:02:33 +08:00
ccl
2017-04-21 23:44:28 +08:00
楼主莫非是王垠?久仰呀
wangjie
2017-04-22 00:12:52 +08:00
@ccl 不是吧, 11L 的链接放错了,下面那个文章才是 lz 的
sunny123
2017-08-04 17:19:41 +08:00
楼主,你好,请问我打算 key 放手机号,用了 long 类型的数据类型输出还是错误,没法正常输出正常的手机号,unsigned long 好像只能输出最大值,代码有些地方还是看不太懂,key 放数组型进行比较是不是比较麻烦,能不能请楼主指导一下
begeekmyfriend
2017-08-11 07:51:35 +08:00
@sunny123 抱歉回复晚了,应该可以的,你打算用定长还是变长数组?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/356232

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX