Level DB --- Block

class Block

class Block是Level DB里面的重要数据结构,该数据结构用来承载已经存储到文件中的数据。已经被存储的数据当需要再次加载、应用(例如搜索),这时首先要把数据加载、初始化到class Block里面。

数据的组织形式:

数据

数据的组织形式如图1所示。data表示指向数据的指针,size表示整个数据的大小。在数据组织上,数据里面采用了多个restart的结构,每个restart有一个完整的key字符串序列,在restart后续的数据,会采用和前一个key值差值的方式存储。在若干个key-value数据后,又会有一个新的restart数据。整个value最后一个4byte数据用来存储一共有多少个restart结构数据。

                                                                图1 Block 承载的数据流

restart数据

每个restart数据可以保存完整的key,然后是该key对应的完整的value数据。再后续的数据其中的key都是和上一个数据的差值部分,value数据依然是完整存储。

差值key的数据表示:

*shared = reinterpret_cast<const uint8_t*>(p)[0];
*non_shared = reinterpret_cast<const uint8_t*>(p)[1];

value表示:

*value_length = reinterpret_cast<const uint8_t*>(p)[2];

经过若干个这样的结构,又会重新有一个restart结构。

整个entry的内存组织形式如图2所示

                                                      图2 单个entry的内存数据组织

restart数据检索

restart结构offset结构数据数组的起始地址:

restart_offset_ = size_ - (1 + NumRestarts()) * sizeof(uint32_t);

restart_offset_之后,记录restart数据长度的最后4个byte之前,这段连续的数组里面就记录每个restart在整个数据里面的offset,具体的代码如下:

uint32_t GetRestartPoint(uint32_t index) {assert(index < num_restarts_);return DecodeFixed32(data_ + restarts_ + index * sizeof(uint32_t));}

里面的restarts_是restart_offset_,他们俩是同一个数据。

Block  Iterator

Block Iterator 是 Block 和 外界的一个interface,对Block的操作都是通过对Iterator的函数方法使用来实现的。下面介绍一下这些函数方法。

Iterator的数据成员

//comparator 是比较key的函数方法
const Comparator* const comparator_;//对应Block里面的data指针
const char* const data_;//restart的数量
uint32_t const num_restarts_;//iterator当前位置的offset
uint32_t current_;//iterator当前所对应的restart的index
uint32_t restart_index_;//当前位置entry的key序列
std::string key_;//当前位置entry的value序列
Slice value_;Status status_;

Iterator的函数成员

//key 比较
inline int Compare(const Slice& a, const Slice& b) //下一个entry(key-value结构存储)的地址(offset)。
inline uint32_t NextEntryOffset() const //该函数提供第index个restart的地址(offset)
uint32_t GetRestartPoint(uint32_t index)//当前Iterator是否合法,这里面主要是通过当前entry的offset是否已经超过了数据所在的地址范围
bool Valid() const//获得下一个entry的key和value,同时更新current_和restart_index_
bool ParseNextKey()//整个Iterator位置调整到第一个restart位置,以及更新key_、value_、current_和restart_index_到第一个entry值
void SeekToFirst() override//整个Iterator位置调整到最后一个restart位置,以及更新key_、value_、current_和restart_index_到最后一个entry值
void SeekToLast() override//检索特定的key,在restart检索用到了二分查找,找到特定的restart使用线性查找
void Seek(const Slice& target) override//整个Iterator位置调整到当前位置的前一个位置,以及更新key_、value_、current_和restart_index_到当前位置前一个位置的entry值
void Prev() override//整个Iterator位置调整到当前位置的前一个位置,以及更新key_、value_、current_和restart_index_到当前位置后一个位置的entry值
void Next() override

总结

总结一下,Block是一个核心结构,代码逻辑清晰。这里面有几点好的设计可以借鉴:

1.使用restart + diff key的形式,由于key都是有序的,所以一个key和他前一个key的序列重复度应该是很高的,这样做可以有效提高存储效率。

2.使用restart,有益于检索效率,可以应用二分检索,否则只能使用顺序检索。

3.Block Iterator Iterator的使用恰当好处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/59730.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

梯度下降和梯度上升的区别

目录 梯度下降梯度上升总结 梯度下降 定义和目的&#xff1a; 梯度下降是一种优化算法&#xff0c;用于最小化一个目标函数 J ( θ ) J(\theta) J(θ)。常用于监督学习&#xff0c;表示模型预测和实际结果之间的误差。梯度下降的目的是找到使损失函数最小化的参数 θ \theta…

记录大学Linux运维上机考试题目和流程

备注&#xff1a;今年的Linux操作系统考试已经全部结束&#xff0c;仅作为一个记录和留念 前提&#xff1a;配置环回网卡和环境和nat网卡 1、搭建dns服务器 2、Apache和http服务 3、搭建postfix邮件服务器实现邮件发送 4、搭建vsftpdFTP服务器实现文件上传 题目如下&…

前端面试笔试(四)

目录 一、数据结构算法等综合篇 1.线性探查法解决哈希冲突 2.请求分页系统中文件区和对换区 3.RADIUS认证协议&#xff0c;运行在哪个网络协议上 二、代码输出篇 1.res[1,2,100].map(parseInt) 如果我们想要输出为[1,2,100]&#xff0c;可以&#xff1a; 还可以换map里…

Qt问题:不同文件中相同命名空间的多个 Q_NAMESPACE

我在同一namespace中定义了2个enum&#xff0c;定义如下&#xff1a; a.h // // Created by qiaowei on 2024/11/15. //#ifndef ELECTRICITY_MONTHS_ENUM_H #define ELECTRICITY_MONTHS_ENUM_H#include <QMetaObject>namespace data {Q_NAMESPACEenum class Months_enu…

NVR录像机汇聚管理EasyNVR多品牌NVR管理工具视频汇聚技术在智慧安防监控中的应用与优势

随着信息技术的快速发展和数字化时代的到来&#xff0c;安防监控领域也在不断进行技术创新和突破。NVR管理平台EasyNVR作为视频汇聚技术的领先者&#xff0c;凭借其强大的视频处理、汇聚与融合能力&#xff0c;展现出了在安防监控领域巨大的应用潜力和价值。本文将详细介绍Easy…

linux进程、文件常见命令

文章目录 进程相关命令日志相关命令 进程相关命令 在Linux系统中&#xff0c;有多个命令可以用来管理和监控进程。以下是一些常用的进程相关命令&#xff1a; ps&#xff1a;查看当前运行的进程。 ps aux&#xff1a;显示所有运行中的进程。ps -ef&#xff1a;显示所有进程的…

Django中的URL配置与动态参数传递(多种方法比较)

Django中的URL配置与动态参数传递(多种方法比较) 目录 ✨ 基础URL配置与re_path()的解读&#x1f527; path()与re_path()的对比分析&#x1f680; 动态参数处理方案详解&#x1f4d8; 正则表达式匹配的优势与劣势&#x1f9e9; 利用path()进行路径参数处理的实现与优劣&…

OpenSIP2.4.11 向 FreeSWITCH 注册

应朋友要求做了个简单的测试&#xff0c;花费时间不过半小时&#xff0c;记录如下&#xff1a; OpenSIPS IP 地址&#xff1a;192.168.31.213 FreeSWITCH IP 地址&#xff1a;192.168.31.166 加载 uac_registrant 模块&#xff08;这个模块依赖 uac_auth 模块&#xff0c;得…

C/C++运行库

文章目录 入口函数glibc入口函数_start__libc_start_mainMSVC入口函数堆初始化IO初始化 glibc C运行库glibc启动文件gcc补充C全局构造与析构 运行库对于多线程的改进线程局部存储 入口函数 使用C语言编写的一个hello world程序在用户看来的确非常简单&#xff0c;源代码仅需要…

学习使用LVGL,依赖官方网址

LVGL Basics — LVGL documentation LVGL基础知识 LVGL是一个开源的图形库&#xff0c;提供创建嵌入式GUI的一切 LVGL数据流 您为每个物理显示面板 创建一个显示器 (lv_display) &#xff0c;在其上创建屏幕小部件&#xff0c;将小部件添加到这些屏幕上。要处理触摸、鼠标、…

计算机网络HTTP——针对实习面试

目录 计算机网络HTTP什么是HTTP&#xff1f;HTTP和HTTPS有什么区别&#xff1f;分别说明HTTP/1.0、HTTP/2.0、HTTP/3.0请说明访问网页的全过程请说明HTTP常见的状态码Cookie和Session有什么区别&#xff1f;HTTP请求方式有哪些&#xff1f;请解释GET和POST的区别&#xff1f;HT…

大数据-226 离线数仓 - Flume 优化配置 自定义拦截器 拦截原理 了 拦截器实现 Java

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; 目前开始更新 MyBatis&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff0…

深入解析生成对抗网络(GAN)

1. 引言 背景介绍 在过去的几十年中&#xff0c;深度学习在计算机视觉、自然语言处理和语音识别等领域取得了巨大的突破。然而&#xff0c;如何让机器生成高质量、逼真的数据一直是人工智能领域的挑战。传统的生成模型&#xff0c;如变分自编码器&#xff08;VAE&#xff09;…

无人机动力系统测试-实测数据与CFD模拟仿真数据关联对比分析

我们经常被问到这样的问题&#xff1a;“我们计划运行 CFD 仿真&#xff0c;我们还需要对电机和螺旋桨进行实验测试吗&#xff1f;我们可能有偏见&#xff0c;但我们的答案始终是肯定的&#xff0c;而且有充分的理由。我们自己执行了大量的 CFD 仿真&#xff0c;但我们承认&…

验证双随机矩阵(doubly stochastic matrix) 满足C(P)=C(P^T)

验证双随机矩阵(doubly stochastic matrix) 满足C( P P P)C(P T ^T T) 双随机矩阵&#xff1a; 在数学中&#xff0c;一个双随机矩阵&#xff08;doubly stochastic matrix&#xff09;是一个满足以下条件的矩阵&#xff1a; 非负矩阵&#xff1a;矩阵中的每个元素都是非负的…

教资考试题目

综合多选题 高等教育政策在评估的实施阶段需要完成的工作有&#xff08;BCD&#xff09; A. 制定评估计划 B. 收集整理政策信息 C. 统计、分析政策信息 D. 充分运用评估方法获取结论 恪尽师者规范&#xff0c;严守师德“红线”&#xff0c;需要教师&#xff08;ABCD&…

Chrome 浏览器开启打印模式

打开开发者工具ctrl shift p输入print 找到 Emulate CSS print media type

Vite初始化Vue3+Typescrpt项目

初始化项目 安装 Vite 首先&#xff0c;确保你的 Node.js 版本 > 12.0.0。然后在命令行中运行以下命令来创建一个 Vite Vue 3 TypeScript 的项目模板&#xff1a; npm init vitelatest进入项目目录 创建完成后&#xff0c;进入项目目录&#xff1a; cd vue3-demo启动…

24 年第十届数维杯国际数模竞赛赛题浅析

本次万众瞩目的数维杯国际大学生数学建模赛题已正式出炉&#xff0c;无论是赛题难度还是认可度&#xff0c;该比赛都是数模届的独一档&#xff0c;含金量极高&#xff0c;可以用于综测加分、保研、简历添彩等各方面。考虑到大家解题实属不易&#xff0c;为了帮助大家取得好成绩…