More than code

More Than Code
The efficiency of your iteration of reading, practicing and thinking decides your understanding of the world.
  1. 首页
  2. 未分类
  3. 正文

leveldb-7 SSTable(2) filter block

2022年7月3日 574点热度 0人点赞 0条评论

SSTable(2) filter block

文档在这里

这次代码比较简单

20220702214724

StartBlock的作用就是不断构建索引到filter offsets

20220702214803

Finish会把剩下的数据的filter构建出来。然后把每块对应的offset追加进来,最后加上总共的array length以及BaseLg。具体含义可以看文档

20220702214945

result就是这些data block

20220702215604

可以看到核心的逻辑就是这个GenerateFilter了。他会先把当前的buffer切成原本的key。然后通过CreateFilter创建filter

这里的CreateFilter就是创建bloom filter了,代码也比较简单

20220702215751

计算本次bloom filter需要的大小。就是bytes,然后resize为他分配空间

布隆过滤器在文档中也有写,在这里

k表示哈希函数的个数,插入到过滤器的尾部。

遍历每个key,这里是通过double hashing来生成若干个哈希值,而不是通过不同的哈希函数。根据代码可以看到,一个key走一次BloomHash,生成h。后续的哈希值都是通过原有的哈希值进行变换得到的。也就是说如果两个值的h生成的是相同的话,那么他们就会完全冲突。

直觉上讲,只生成一个哈希值感觉冲突会很高。但是换个角度我们可以这样看。我们将一个key,通过k个哈希函数,相当于是向k个1维空间做投影。得到k个数字。这里生成一次哈希再去做投影,所以其实是一样的,只不过这几个空间有一定的关联。

检查的逻辑也比较简单

20220702221534

k作为最后一个byte存在。然后按照刚才的哈希方法,只要发现了有位不匹配就返回false

20220702221732

最后是filter block的读取

data就是布隆过滤器,offset则是布隆过滤器对应的offset,num则是布隆过滤器的数量

检查key是否match的时候,会先根据block offset来找到对应的布隆过滤器。然后调用刚才说的KeyMayMatch进行具体的判断。

构建filter block是根据data block来构建的。也就是说一个data block可能对应一到多个filter block。我目前的理解就是查找filter block的时候,是根据data block的offset来确定的,这个具体的过程还是要看table builder。之后的文章会讲具体的映射过程。

标签: 暂无
最后更新:2022年7月9日

sheep

think again

点赞
< 上一篇
下一篇 >

文章评论

取消回复

COPYRIGHT © 2021 heavensheep.xyz. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS