LevelDB的边边角角之一
LevelDB的边边角角之一
0, Varint64
变长数字,主要用于压缩数字,来源于protobuf。
1, Log 和Table的文件格式
Google recordio的文件格式
|
|
Checksum: 32bits;
Original Size: 64bits,数据的原始大小;
Compressed Size: 64bits压缩后的大小,如果不是压缩,就为0;
Data: 实际的数据
LevelDB memtable: Arena+SkipList
Arena,
所有的block都保存在一个vector<char*>中
1,当前block有freeSpace>size直接返回;
2,如果size大于blockSize/4则new_block返回,否则只new_block并用block其中的一部分(这样浪费了当前的block剩余空间);
SkipList,
LevelDB log文件格式
block := record* trailer
record :=
checksum: uint32 //crc32c of type and data[], little-endian
length: uint32 // little-endian?其实是uint16
type: uint8 // enum of { FULL, FIRST, MIDDLE, LAST}
data: uint[length]
下图为一个Block(32KB), log file由一连串block组成。
Record 1
|
Record 2... |
Record n |
Trailer |
与recordio format的对比:
好处:可以直接跳过一个一个block
坏处:暂时对小的record没有packing,并没有压缩数据,但都可以通过添加type进行支持。
LevelDB table文件格式
immutable, 不可修改的。
k/v 对都是有序地按序写在data block中,data/index block均可以被压缩(状态位在?)
meta block就是下面的filter/stat meta block,也可以支持更多的。
每个block的大小?
index和footer放在文件最后是宜于生成文件,并方便open文件后重定位。
Data block 1 |
Data block 2 |
... |
Data block N |
Meta block 1 |
… |
Meta block K |
Meta Index block |
Index block |
Footer (fixed size: starts at file_size - sizeof(footer)) |
BlockHandle:
offset: varint64
size: varint64
相当于内部index到data的指针
metaindex
key name of meta block
value BlockHandle 指向meta block
index,每个data block一条记录
key string>=last_key
value BlockHandle指向data block
footer 这是定长的。
metaindex_handle: char[p], block handle for metaindex
index_handle: char[q], block handle for index
padding: char[40-p-q], 填充zeroed bytes
40==2*BlockHandle::kMaxEncodedLength
magic: fixed64
filter meta block
[TBD]
stat meta block
data size/ index size/ key size(uncompressed)/ value size(uncompressed)
number of entries/ number of data blocks
2, 从log file到合并 table file
log file,每个update都添加到log里,当大于(默认4MB)会转为sorted table,
内存中的影像是memtable。生成sst(young level-0)后,这个log就会给删掉,memtable?
sorted tables的compaction,sst分为一系列的levels,young level,也就是level-0,中的文件可能会有覆盖范围的key(overlapping key),而level-L(L>0)则每个文件的key范围都是没有互相覆盖的。
当level-L的所有文件总大小超过10^L(MB)时,会用其中一个level-L的文件File1+所有key范围与File1有覆盖的level-(L+1)的文件File2..k 合并成一个新的level-L+1文件。
这样做的好处?单条的读?bulk的批量读?
Manifest一个普通的log file,保存每个level下的所有sst, 并对应的key ranges,以及其他的meta data。
Current普通文本,里面就指向当前在用的Manifest文件。
其他的Lock文件和dbtmp等等,
A, Reference:
1) leveldb tutorial, http://leveldb.googlecode.com/svn/trunk/doc/index.html
2) leveldb brief of implements, http://leveldb.googlecode.com/svn/trunk/doc/impl.html
3) table file format, http://leveldb.googlecode.com/svn/trunk/doc/table_format.txt
4) log file format, http://leveldb.googlecode.com/svn/trunk/doc/log_format.txt
5) blog 很详细的一个分析 http://blog.csdn.net/sparkliang/article/category/1342001
LevelDB的边边角角之一相关推荐
- 二叉树 跳表_漫谈 LevelDB 数据结构(一):跳表(Skip List)
早对 LevelDB 有所耳闻,这次心血来潮结合一些资料粗略过了遍代码,果然名不虚传--绝对是不世出的工艺品!如果你对存储感兴趣.如果你想优雅使用C++.如果你想学习如何架构项目,都推荐来观摩一下.谷 ...
- 插入的数据不能时时查询到_漫谈 LevelDB 数据结构(一):跳表(Skip List)
早对 LevelDB 有所耳闻,这次心血来潮结合一些资料粗略过了遍代码,果然名不虚传--绝对是不世出的工艺品!如果你对存储感兴趣.如果你想优雅使用C++.如果你想学习如何架构项目,都推荐来观摩一下.谷 ...
- Leveldb源码分析--1
[前言:看了一点oceanbase,没有意志力继续坚持下去了,暂时就此中断,基本上算把master看完了,比较重要的update server和merge server代码却没有细看.中间又陆续研究了 ...
- 从JoinBatchGroup 代码细节 来看Rocksdb的相比于leveldb的写入优势
文章目录 1. Rocksdb写入模型 2. LevelDB写入的优化点 3. Rocksdb 的优化 1. Busy Loop 2. Short Wait -- SOMETIMES busy Loo ...
- 数据集cifar10到Caffe支持的lmdb/leveldb转换的实现
在 http://blog.csdn.net/fengbingchun/article/details/53560637 对数据集cifar10进行过介绍,它是一个普通的物体识别数据集.为了使用Caf ...
- 【AI】caffe使用步骤(一):将标注数据生成lmdb或leveldb
1.简述 caffe使用工具 convert_imageset 将标注数据转换成lmdb或leveldb格式,convert_imageset 使用方法可以参考脚本examples/imagenet/ ...
- LevelDb系列之简介
说起LevelDb也许您不清楚,但是如果作为IT工程师,不知道下面两位大神级别的工程师,那您的领导估计会Hold不住了:Jeff Dean和Sanjay Ghemawat.这两位是Google公司重量 ...
- leveldb源码分析:数据查询
leveldb数据查询 查询的示例代码如下: string res; status = db->Get(ReadOptions(), "KeyNameExample", &a ...
- leveldb源码分析:数据插入续(跳表)
leveldb数据的插入-跳表 本文主要是接着上一篇文章,继续深入探索Write函数调用插入之后的流程. status = WriteBatchInternal::InsertInto(updates ...
最新文章
- 窄带信号和宽带信号的区别和联系
- Failed to initiate service connection to simulator
- boost::make_reverse_graph用法的测试程序
- java实现线程的方式_java多线程实现的四种方式
- java range类_Java即时类| range()方法与示例
- 马踏棋盘算法(骑士周游问题)
- (07)VHDL实现闪灯
- 第二章节 ASP.NET 验证控件(二)
- java虚拟器安装教程_Java虚拟机安装教程都有什么?该如何下载?
- python杨辉三角居中_python杨辉三角
- mac安装旺旺启动台找不到_如何正确安装和卸载Mac软件?
- RapidShare 真实链接抓取助手
- 用opencv在图片上面添加水印
- Linux环境下配置虚拟ip,方法2:单网卡绑定多IP
- Mumble安装部署教程
- P2178 [NOI2015] 品酒大会(并查集+后缀数组)
- Android2.1源码目录结构
- IDC:阿里云获2021中国数据治理平台市场份额第一
- Total Commander配置详解
- HTTPSS证书制作笔记
热门文章
- 超休闲游戏潜龙在渊,《Catwalk Beauty》一鸣惊人
- MATLAB基于多目标算法的冷热电联供型综合能源系统运行优化
- centos上通过ll或者du命令查看文件的大小
- 解决Mac能接受qq消息但打不开网页的问题
- GetLastError错误码中文大全
- 【破解作品】Access密码查看器 破解版 注册码
- 何亮Freebsd Unix安装配置视频教程
- 人体微生物组和幼儿成长---前1000天及以后
- Google Chrome浏览器出现:您目前无法访问 XX.XX.XX.XX,因为此网站发送了 Google Chrome 无法处理的杂乱凭据。
- Book Collector for Mac(图书信息管理软件)