1K 行 C 写了 3 年,这是我从业以来写过的最烧脑的代码!

2018 年 1 月 23 日
 begeekmyfriend
就这么一个数据结构玩意儿,B+树磁盘存储 CRUD: https://github.com/begeekmyfriend/bplustree

从 2014 年 9 月第一次提交了内存版本实现,到 2018 年 1 月的磁盘版本,总共(坚持)提交了近 200 次。。。

我已经没有力气去说明这三年都迭代了些什么,总之取得了这样的性能(视机器而定)

100W 插入——~3s
100W 删除——~3s
1KW 插入——<30s
1KW 删除——<30s
1 亿插入——<5min
1 亿删除——<5min
10 亿插入——~45min
10 亿删除——~45min

好吧,1 billion 那是我意淫的,我等不起这么多时间。。。读性能就不用列了吧,B+树你懂的

老实说 3 年前我就想写一个 DB,SQL 那种,但光一个 B+树耗了我 3 年最好的时光。我承认不是天才,3 年的迭代都是我犯过的浑与错误,一直坚持到现在。我以为与其写一个各方面都平庸的成品,不如写一个尽量做到极致的 demo,代码量基本维持在 1K 行。好歹也累积了 300+stars 了,感谢用户们的认可。

这种迭代是烧脑的,也是痛苦的。每一次对结构体的压榨,都要牵动数百行源文件的更改,有时候一个提交意味着一整个下午,我的大脑长时间处于马拉松选手泡在 20~30 公里处的感觉,相信不少同行都有过这种体验。。。

不多说了,大家认为有何改进的地方,欢迎交流~
21837 次点击
所在节点    程序员
131 条回复
feng32
2018 年 1 月 23 日
赞一个
因为业务关系,我现在只记得 k-d 树的写法了
begeekmyfriend
2018 年 1 月 23 日
@feng32 KD 树我也有,要不要 PK 一下: https://github.com/begeekmyfriend/kdtree
begeekmyfriend
2018 年 1 月 23 日
@stabc 懒得贴了,thinkpad t440,后面没字母
unique
2018 年 1 月 23 日
为楼主的坚持点赞👍🏾
rashawn
2018 年 1 月 23 日
为啥 trending 上有个一样名字的项目 但不是楼主写的 好奇怪
rashawn
2018 年 1 月 23 日
rashawn
2018 年 1 月 23 日
感觉你们两个是有缘人
lusizeng
2018 年 1 月 23 日
楼主牛人
begeekmyfriend
2018 年 1 月 23 日
@rashawn 你看他 issue,没实现删除,骗 star 来着~
begeekmyfriend
2018 年 1 月 23 日
@acros 人家那是正式发布到很多版本后才写博客的,我连个 database 都没力气写了
letianqiu
2018 年 1 月 23 日
正好在看 B 树,有个问题没有懂,想请教。B 树究竟如何减少磁盘 I/O ?如果 B 树节点里有记录储存在硬盘里的实际地址,那么这个地址是怎么得到的?在写文件之前应该是拿不到实际地址的?如果写完才能拿到,那么是不是再将地址写入?
begeekmyfriend
2018 年 1 月 23 日
@letianqiu 我写的是 B+树。
如果要减少磁盘 I/O 那么尽量一个节点容纳多个索引,索引节点越少,读操作 I/O 次数越少,查询越快,但也不能太多,否则插入删除就需要相关子节点全部更新,这就是为什么 B 树的写效率偏低。
我是基于 POSIX 实现的,不是裸机,所以存储的是文件,实际地址自然是文件字节偏移,后面该如何处理你应该明白
HaoyangWei
2018 年 1 月 23 日
滋瓷~
佩服楼主的毅力
szhaoliang
2018 年 1 月 23 日
都坚持三年了再坚持一下,当初我就是打算做一下别的放松放松再回来,结果现在就只能给大佬倒茶水了......
waterlaw
2018 年 1 月 23 日
楼主 Linux 下报如下错误:
```
/home/zjp/Projects/bplustree/tests/bplustree_demo.c: In function ‘ bplus_tree_setting ’:
/home/zjp/Projects/bplustree/tests/bplustree_demo.c:29:25: error: this statement may fall through [-Werror=implicit-fallthrough=]
printf("\n");
^~~~~~~~~~~~
/home/zjp/Projects/bplustree/tests/bplustree_demo.c:30:17: note: here
case 'q':
^~~~
/home/zjp/Projects/bplustree/tests/bplustree_demo.c:54:25: error: this statement may fall through [-Werror=implicit-fallthrough=]
printf("\n");
^~~~~~~~~~~~
/home/zjp/Projects/bplustree/tests/bplustree_demo.c:55:17: note: here
case 'q':

```
jinfeng333
2018 年 1 月 23 日
大神 厉害了 观摩一下代码
begeekmyfriend
2018 年 1 月 23 日
@waterlaw 你这是 clang 吧,还是 demo 测试里的,我没有在 switch-case 里用 break,有意为之,编译选项过于严格了。
Rorysky
2018 年 1 月 23 日
有毅力,观摩学习下代码~
crayhuang
2018 年 1 月 23 日
膜拜~
bigeast
2018 年 1 月 24 日
巧了,今天在 hacker news 上看到一条推送,也是一个 B+树,名字都一模一样,https://github.com/NicolasLM/bplustree

不过是用 python 写的。

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

https://v2ex.ih06.com/t/425258

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

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

© 2021 V2EX