当前位置: 首页 > article >正文

Level DB --- TableBuilder

TableBuilder是Level DB里面重要的类和模块,它描述了数据如何序列化到文件中,以及数据里面的格式逻辑。它里面包含了之前介绍的多个模块和类。

data block、filter block和index block

block格式,之前已经介绍过Level DB --- BlockBuilder-CSDN博客 、 Level DB --- Block-CSDN博客。data block 是借助block为基础数据结构用来存储 Key-Value数据。filter 之前也已经介绍过Level DB --- BloomFilterPolicy-CSDN博客,filter block 是借助block为基础的数据结构存储filter数据。table中有多个data block,么个data block有在table中自己的index,index block是借助block为基础数据结构用来存储data block的index。这个数据组织如图1所示。

                                                          图1.   table builder 

写入数据

写入数据,这里写数据使用WritableFile(Level DB --- env.File-CSDN博客),block的序列化数据支持不压缩或是压缩数据,且使用crc做校验。

index filter key

在计算上由于key一直都是有序的,所以index block里面,其key是由上一个data block最后一个key,和下一个data block第一个key,比较计算组成,其计算代码和注释如下:

 void FindShortestSeparator(std::string* start,
                             const Slice& limit) const override {
    // Find length of common prefix
    size_t min_length = std::min(start->size(), limit.size());
    size_t diff_index = 0;
    while ((diff_index < min_length) &&
           ((*start)[diff_index] == limit[diff_index])) {
      diff_index++;
    }

    if (diff_index >= min_length) {
      // Do not shorten if one string is a prefix of the other
    } else {
      uint8_t diff_byte = static_cast<uint8_t>((*start)[diff_index]);
      if (diff_byte < static_cast<uint8_t>(0xff) &&
          diff_byte + 1 < static_cast<uint8_t>(limit[diff_index])) {
        //获得diff位上字符在字母表中的下一个字符,"the quick brown fox" and "the who" 的例子,通过这种方式,计算得到"the r"
        (*start)[diff_index]++;
        start->resize(diff_index + 1);
        assert(Compare(*start, limit) < 0);
      }
    }
  }


http://www.kler.cn/a/521333.html

相关文章:

  • C 或 C++ 中用于表示常量的后缀:1ULL
  • C++从入门到实战(二)C++命名空间
  • 【信息系统项目管理师-选择真题】2016上半年综合知识答案和详解
  • 第三十一周学习周报
  • 计算机图形学试题整理(期末复习/闭or开卷/>100道试题/知识点)
  • 塔罗牌(基础):大阿卡那牌
  • 2025美赛数学建模C题:奥运金牌榜,完整论文代码模型目前已经更新
  • 用C++编写一个2048的小游戏
  • 【2024年华为OD机试】(A卷,100分)- 识图谱新词挖掘 (JavaScriptJava PythonC/C++)
  • python的设计模式
  • 【miniconda】:langraph的windows构建
  • windows蓝牙驱动开发-生成和发送蓝牙请求块 (BRB)
  • 10 外观(Facade)模式
  • 基于先验领域知识的归纳式多实例多标签学习用于牙周病分类| 文献速递 -医学影像人工智能进展
  • 【Django DRF Apps】【文件上传】【断点上传】从零搭建一个普通文件上传,断点续传的App应用
  • 游戏策划的分类
  • 性能测试丨JVM 性能数据采集
  • 【2024年华为OD机试】 (C卷,100分)- 爱吃蟠桃的孙悟空(JavaScriptJava PythonC/C++)
  • SpringSecurity相关面试试题及答案解析
  • Flutter解决macbook M芯片Android Studio中不显示IOS真机的问题