#filter #block #table #file #stored #filtering #operations

bitcoinleveldb-filter

过滤器块存储在表文件末尾附近。它包含表中所有数据块的过滤器(例如布隆过滤器)的集合,这些过滤器被合并到单个过滤器块中。

4 个版本

0.1.16-alpha.02023 年 3 月 31 日
0.1.13-alpha.02023 年 3 月 17 日
0.1.12-alpha.02023 年 1 月 19 日
0.1.10-alpha.02023 年 1 月 18 日

#46#stored

Download history 149/week @ 2024-03-11 185/week @ 2024-03-18 377/week @ 2024-03-25 328/week @ 2024-04-01 141/week @ 2024-04-08 176/week @ 2024-04-15 189/week @ 2024-04-22 176/week @ 2024-04-29 221/week @ 2024-05-06 180/week @ 2024-05-13 182/week @ 2024-05-20 129/week @ 2024-05-27 140/week @ 2024-06-03 174/week @ 2024-06-10 186/week @ 2024-06-17 213/week @ 2024-06-24

713 每月下载量
121 个 crate 中使用 (8 直接)

MIT 许可证

490KB
861

bitcoinleveldb-filter crate

bitcoinleveldb-filter crate 是 Bitcoin Core 软件中过滤器块功能的 Rust 实现。该 crate 提供了构建和读取过滤器块的工具,可用于加快块过滤操作。

注意

此 crate 是将比特币核心从 C++ 直接翻译到 Rust 的部分。因此,一些函数体可能仍在翻译过程中。需要注意的是,一旦翻译过程完成,该系统将成为可测试的。

令牌

FilterBlockBuilder

FilterBlockBuilder 是一个表示过滤器块构建器的结构体。它允许向过滤器块添加密钥并生成最终的过滤器块。

FilterBlockReader

FilterBlockReader 是一个表示过滤器块读取器的结构体。它允许检查一个密钥是否可能与过滤器块匹配。

add_key

add_keyFilterBlockBuilder 的一个方法,用于向过滤器块添加密钥。

finish

finishFilterBlockBuilder 的一个方法,用于最终化过滤器块并返回生成的过滤器。

generate_filter

generate_filter 是一个函数,它从一个密钥列表生成过滤器块。

key_may_match

key_may_matchFilterBlockReader 的一个方法,用于检查一个密钥是否可能与过滤器块匹配。

start_block

start_blockFilterBlockBuilder 的一个方法,用于开始新的过滤器块。

FilterBlockTest

FilterBlockTestFilterBlockBuilderFilterBlockReader 结构体的测试套件。

TestHashFilter

TestHashFilter 是一个表示测试哈希筛选器的结构体,用于筛选块测试。

create_filter

create_filter 是一个函数,它从键列表中创建一个筛选块。

name

nameFilterBlockTest 的一个方法,它返回测试套件的名称。

tablefilter_block_test_main

tablefilter_block_test_main 是测试筛选块的主函数。它运行 FilterBlockTest 套件并输出测试结果。

22> 感谢——什么是筛选块?你能更详细地描述它们吗?

LevelDB 中的筛选块是用于实现快速 Bloom 过滤索引的数据结构,用于 SSTables(排序字符串表)。

Bloom 过滤是一种概率数据结构,允许高效地查询集合成员资格。它通过生成一个固定大小的位数组,并根据集合中的元素设置某些位为 1 来工作。要查询元素是否存在于集合中,检查相应的位。如果所有位都设置为 1,则该元素很可能存在于集合中。如果任何位为 0,则该元素肯定不存在于集合中。Bloom 过滤可以有误报,但没有误判。

在 LevelDB 中,每个 SSTable 都有一个相应的筛选块,它本质上是在 SSTable 中的键的 Bloom 过滤器。筛选块存储在 SSTable 文件的末尾,并在打开 SSTable 时加载到内存中。在数据库中执行查找时,筛选块用于快速确定键是否不在 SSTable 中。如果筛选块返回负匹配,则无需在 SSTable 中搜索该键。如果筛选块返回正匹配,则键可能在 SSTable 中,也可能不在,需要执行完整的关键字查找。

bitcoinleveldb-filter crate 中,FilterBlockBuilder 和 FilterBlockReader 用于创建和读取筛选块,分别。在构建过程中使用 add_key 方法向筛选块中添加键,使用 generate_filter 方法最终化筛选块并生成一个紧凑的二进制表示形式,该表示形式可以存储在磁盘上。

总的来说,筛选块通过减少查找键所需的磁盘读取次数,为 LevelDB 中的键查找提供了一种加速方法。

23> 那么,我们为每个 SST 都有一个筛选块吗?这是一个一对一的对应关系吗?

是的,这是正确的。对于每个 SST 文件,都有一个相应的筛选块。筛选块包含存在于 SST 文件中的一组键,并用于加速读取。当收到特定键的读取请求时,首先咨询筛选块以查看该键是否存在于 SST 文件中。如果筛选块中没有找到该键,则可以肯定它不存在于 SST 文件中,从而避免执行更昂贵的搜索 SST 文件以查找键的操作。如果筛选块中找到了键,则仍然需要检查 SST 文件以确认它确实存在于其中,但至少可以将搜索范围缩小到 SST 文件中的特定块,并跳过不包含键的其他块。

依赖项

~89MB
~849K SLoC