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

2018-01-23 15:11:01 +08:00
 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 公里处的感觉,相信不少同行都有过这种体验。。。

不多说了,大家认为有何改进的地方,欢迎交流~
19324 次点击
所在节点    程序员
131 条回复
duesicilie
2018-01-23 17:36:25 +08:00
滴!发生了什么?这不是个上班时间灌水用的地儿吗
exch4nge
2018-01-23 17:44:37 +08:00
在精神上支持 LZ。不过不知道什么场景下会用 LZ 这种库,生产环境下 leveldb 是更好的一种选择吧。
begeekmyfriend
2018-01-23 17:48:21 +08:00
@exch4nge 本来是想写个 database 的,但按照进度估计写不动了,做到这地步,交接给有缘人吧
zpf124
2018-01-23 17:50:35 +08:00
只能称赞一句,但我技术差太多而且没有什么毅力估计没法模仿大佬的历程。
zouqiang
2018-01-23 17:55:24 +08:00
膜拜
fcten
2018-01-23 18:01:37 +08:00
file: bplustree.c
line: 1079

_max_order = (block_size - sizeof(node)) / (sizeof(key_t) + sizeof(off_t));

有符号数与无符号数一起运算,导致 block_size < sizeof(node) 时返回非预期的结果
begeekmyfriend
2018-01-23 18:03:38 +08:00
@fcten 你给 block_size 设置了一个多大的数?
fcten
2018-01-23 18:06:37 +08:00
@begeekmyfriend
-- B+tree setting...
Set data index file name (e.g. /tmp/data.index):
Set index file block size (bytes, power of 2, e.g. 4096): 4
config node order:1431655762 and leaf entries:1431655762
Please input command (Type 'h' for help): i 1
Segmentation fault (core dumped)
skadi
2018-01-23 18:20:52 +08:00
如果只是数据结构的话,大学的时候 b 树以及几个变种自己都手动实现过.并不觉得...
chenweidong
2018-01-23 18:24:21 +08:00
吊就一个字,我只说一次。
begeekmyfriend
2018-01-23 18:27:55 +08:00
daozhihun
2018-01-23 18:29:50 +08:00
歪个楼,楼主的头像我第一眼看以为是刑舅舅 😂
begeekmyfriend
2018-01-23 18:35:00 +08:00
@skadi 半分钟内插入 1KW 个 key 再说,不然就是假的 B 树
acros
2018-01-23 18:45:45 +08:00
捂着脸说一句:我看不懂(其实也压根没看,B+树磁盘存储 CRUD 几个关键字好像离我很远)。

能搭配开发博客看就好了,或者随便写写开发心得啊。
比如 rapidjson 的这个做法,博客比代码容易引流嘛:
https://github.com/Tencent/rapidjson
https://zhuanlan.zhihu.com/p/20029820
hsuan
2018-01-23 19:08:34 +08:00
挺好的,不过想不到有啥用
stabc
2018-01-23 19:11:11 +08:00
既然说了“视机器而定”,为什么不把你的性能测试的机器硬件贴出来呢?
closedevice
2018-01-23 19:16:33 +08:00
不错,加油
0915240
2018-01-23 19:20:19 +08:00
给大佬端茶倒水
jeffciu
2018-01-23 19:22:43 +08:00
没仔细研究过 B+树,但还是佩服楼主的成果
likuku
2018-01-23 19:24:10 +08:00
1K 行能写这种底层硬功能,也真是了不起!

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

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

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

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

© 2021 V2EX