zoukankan      html  css  js  c++  java
  • boltdb的实现和改进

    整个代码不是很复杂,可以从代码中理解如何实现。

    特点:btree,很小巧,但实现了完整事务机制,稳定,即使丢电也不会导致数据库错误。

    整个结构如下:

    meta page (前两页) --- > freelist page (第三页)
                      |
                      -----> bucket page (属于leaf page 开始是第4页) -> branch page -> leaf page
                                     |
                                     ---------> inline page(放在bucket page上) 

    事务:

    修改会产生镜像页,在写入的时候,先写所有镜像页,然后再写指向镜像页的meta page,如果镜像页没写完,程序就崩溃了,不影响之前的数据,因为meta page没有指向镜像页,如果meta page只写了一半,那么可以用checkSum检查出来,meta page双备份。

    如果事务未提交,meta page不会指向镜像页,也就不会读到事务中的数据。

    问题:

    没做repetable_read级别的事务实现,直接serialize级别的,不允许同时写(但允许写时读),所以导致写入慢。

    默认每次写都刷盘,大大拉低速度。这个可以调。

    内存占用随着数据变得太大,这个我觉得是代码本身的问题,太多的东西序列化到了内存,这部分的代码也写得不好,太晦涩,难改。

    改进的方法?:

    增加一个持久层(线性写入)和内存层(用于查询,未写入boltdb之前写入内存),提升并发,然后再批量写入boltdb。

  • 相关阅读:
    利用python做矩阵的简单运算(行列式、特征值、特征向量等的求解)
    numpy.linalg.svd函数
    梯度裁剪(Clipping Gradient):torch.nn.utils.clip_grad_norm
    tf.matmul()报错expected scalar type Float but found Double
    1283 最小周长
    1182 完美字符串
    1091 线段的重叠
    1090 3个数和为0
    1087 1 10 100 1000
    1083 矩阵取数问题
  • 原文地址:https://www.cnblogs.com/dearplain/p/8011725.html
Copyright © 2011-2022 走看看