LevelDB的边边角角之一

0, Varint64

变长数字,主要用于压缩数字,来源于protobuf。

1, Log 和Table的文件格式

Google recordio的文件格式

Checksum

Original size

Compressed Size

(un/compressed)

Data

Checksum

Original size

Compressed Size

(un/compressed)

Data

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

Checksum

Length

Type

data

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 tablescompaction,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的边边角角之一相关推荐

  1. 二叉树 跳表_漫谈 LevelDB 数据结构(一):跳表(Skip List)

    早对 LevelDB 有所耳闻,这次心血来潮结合一些资料粗略过了遍代码,果然名不虚传--绝对是不世出的工艺品!如果你对存储感兴趣.如果你想优雅使用C++.如果你想学习如何架构项目,都推荐来观摩一下.谷 ...

  2. 插入的数据不能时时查询到_漫谈 LevelDB 数据结构(一):跳表(Skip List)

    早对 LevelDB 有所耳闻,这次心血来潮结合一些资料粗略过了遍代码,果然名不虚传--绝对是不世出的工艺品!如果你对存储感兴趣.如果你想优雅使用C++.如果你想学习如何架构项目,都推荐来观摩一下.谷 ...

  3. Leveldb源码分析--1

    [前言:看了一点oceanbase,没有意志力继续坚持下去了,暂时就此中断,基本上算把master看完了,比较重要的update server和merge server代码却没有细看.中间又陆续研究了 ...

  4. 从JoinBatchGroup 代码细节 来看Rocksdb的相比于leveldb的写入优势

    文章目录 1. Rocksdb写入模型 2. LevelDB写入的优化点 3. Rocksdb 的优化 1. Busy Loop 2. Short Wait -- SOMETIMES busy Loo ...

  5. 数据集cifar10到Caffe支持的lmdb/leveldb转换的实现

    在 http://blog.csdn.net/fengbingchun/article/details/53560637 对数据集cifar10进行过介绍,它是一个普通的物体识别数据集.为了使用Caf ...

  6. 【AI】caffe使用步骤(一):将标注数据生成lmdb或leveldb

    1.简述 caffe使用工具 convert_imageset 将标注数据转换成lmdb或leveldb格式,convert_imageset 使用方法可以参考脚本examples/imagenet/ ...

  7. LevelDb系列之简介

    说起LevelDb也许您不清楚,但是如果作为IT工程师,不知道下面两位大神级别的工程师,那您的领导估计会Hold不住了:Jeff Dean和Sanjay Ghemawat.这两位是Google公司重量 ...

  8. leveldb源码分析:数据查询

    leveldb数据查询 查询的示例代码如下: string res; status = db->Get(ReadOptions(), "KeyNameExample", &a ...

  9. leveldb源码分析:数据插入续(跳表)

    leveldb数据的插入-跳表 本文主要是接着上一篇文章,继续深入探索Write函数调用插入之后的流程. status = WriteBatchInternal::InsertInto(updates ...

最新文章

  1. 窄带信号和宽带信号的区别和联系
  2. Failed to initiate service connection to simulator
  3. boost::make_reverse_graph用法的测试程序
  4. java实现线程的方式_java多线程实现的四种方式
  5. java range类_Java即时类| range()方法与示例
  6. 马踏棋盘算法(骑士周游问题)
  7. (07)VHDL实现闪灯
  8. 第二章节 ASP.NET 验证控件(二)
  9. java虚拟器安装教程_Java虚拟机安装教程都有什么?该如何下载?
  10. python杨辉三角居中_python杨辉三角
  11. mac安装旺旺启动台找不到_如何正确安装和卸载Mac软件?
  12. RapidShare 真实链接抓取助手
  13. 用opencv在图片上面添加水印
  14. Linux环境下配置虚拟ip,方法2:单网卡绑定多IP
  15. Mumble安装部署教程
  16. P2178 [NOI2015] 品酒大会(并查集+后缀数组)
  17. Android2.1源码目录结构
  18. IDC:阿里云获2021中国数据治理平台市场份额第一
  19. Total Commander配置详解
  20. HTTPSS证书制作笔记

热门文章

  1. 超休闲游戏潜龙在渊,《Catwalk Beauty》一鸣惊人
  2. MATLAB基于多目标算法的冷热电联供型综合能源系统运行优化
  3. centos上通过ll或者du命令查看文件的大小
  4. 解决Mac能接受qq消息但打不开网页的问题
  5. GetLastError错误码中文大全
  6. 【破解作品】Access密码查看器 破解版 注册码
  7. 何亮Freebsd Unix安装配置视频教程
  8. 人体微生物组和幼儿成长---前1000天及以后
  9. Google Chrome浏览器出现:您目前无法访问 XX.XX.XX.XX,因为此网站发送了 Google Chrome 无法处理的杂乱凭据。
  10. Book Collector for Mac(图书信息管理软件)