V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
begeekmyfriend
V2EX  ›  程序员

B+树实现磁盘存储

  •  
  •   begeekmyfriend ·
    begeekmyfriend · 2017-04-20 17:54:59 +08:00 · 9443 次点击
    这是一个创建于 2758 天前的主题,其中的信息可能已经有所发展或是发生改变。

    三年前我就想写一个关系数据库了,无奈却苦于 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)级别,电脑搞坏我全陪!

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

    seriously ???
    lbp0200
        8
    lbp0200  
       2017-04-21 08:18:20 +08:00 via Android
    可以实现 nosql ,比如 key 、 value
    begeekmyfriend
        9
    begeekmyfriend  
    OP
       2017-04-21 09:30:46 +08:00
    @micyng 主要还是节点分裂点的选择不一样,比如我一向是(len + 1) / 2 ,而他则有时这样,有时又是 len / 2 ,导致结构不一样,但不影响效果和效率。另外我仍然保留了内存版,你可以观察效果,并且随意设置节点大小,比如把叶子设置得比非叶子更大一点: https://github.com/begeekmyfriend/bplustree/tree/in-memory
    begeekmyfriend
        10
    begeekmyfriend  
    OP
       2017-04-21 09:40:50 +08:00
    @lbp0200 nosql 原本不需要 B+树,你看 redis 实现过吗? B+树本来就是为 SQL 实现的,它比 B 树的优势在于范围查询更快,因为数据都在叶子节点上,所有的叶子节点又在同一底层上
    begeekmyfriend
        11
    begeekmyfriend  
    OP
       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
        12
    begeekmyfriend  
    OP
       2017-04-21 10:02:04 +08:00
    抱歉,上楼链接放错了, V2EX 不支持删除啊: http://coolshell.cn/articles/17225.html
    artandlol
        13
    artandlol  
       2017-04-21 11:34:15 +08:00
    “电脑搞坏我全陪 ” 好可怕 直男不好这口
    AngelCriss
        14
    AngelCriss  
       2017-04-21 17:28:27 +08:00 via Android
    你这个有内存泄漏啊
    begeekmyfriend
        15
    begeekmyfriend  
    OP
       2017-04-21 17:47:03 +08:00
    @AngelCriss 请给出证据,我使用 valgrind 跑过的
    begeekmyfriend
        16
    begeekmyfriend  
    OP
       2017-04-21 18:02:33 +08:00
    ccl
        17
    ccl  
       2017-04-21 23:44:28 +08:00
    楼主莫非是王垠?久仰呀
    wangjie
        18
    wangjie  
       2017-04-22 00:12:52 +08:00
    @ccl 不是吧, 11L 的链接放错了,下面那个文章才是 lz 的
    sunny123
        19
    sunny123  
       2017-08-04 17:19:41 +08:00
    楼主,你好,请问我打算 key 放手机号,用了 long 类型的数据类型输出还是错误,没法正常输出正常的手机号,unsigned long 好像只能输出最大值,代码有些地方还是看不太懂,key 放数组型进行比较是不是比较麻烦,能不能请楼主指导一下
    begeekmyfriend
        20
    begeekmyfriend  
    OP
       2017-08-11 07:51:35 +08:00 via Android
    @sunny123 抱歉回复晚了,应该可以的,你打算用定长还是变长数组?
    sunny123
        21
    sunny123  
       2017-09-20 08:56:43 +08:00
    @begeekmyfriend 好久没来了,感谢回复,问题已解决,用的 string 形式的 key
    begeekmyfriend
        22
    begeekmyfriend  
    OP
       2017-09-20 14:30:43 +08:00
    @sunny123 用 C++写的么,发展的怎样了,前端用了 SQL 没:-)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3504 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 04:34 · PVG 12:34 · LAX 20:34 · JFK 23:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.