Prefix Filter: Practically and Theoretically Better Than Bloom

Prefix Filter: Practically and Theoretically Better Than Bloom

许多近似成员查询数据结构或过滤器的应用只需要一个支持插入而不支持删除的增量过滤器。然而,增量过滤器的设计空间缺少一个结合了空间效率、快速查询和快速插入的“甜蜜点”过滤器。增量式过滤器,如Bloom过滤器和阻塞式Bloom过滤器,空间效率不高。动态过滤器(即支持删除),如布谷鸟过滤器或向量商过滤器,是空间高效的,但不能表现出一致的快速插入和查询。

本文提出前缀过滤器,一种增量过滤器,解决了上述挑战:(1)其空间(比特)类似于最新的动态过滤器;(2)查询吞吐量高,与布谷鸟过滤器相当;(3)插入吞吐率高,总体构建时间比向量商滤波器和布谷鸟滤波器分别快1.39×-1.46×和3.2×-3.5×。本文对前缀过滤器进行了严格的分析,该分析也适用于实际的集合大小(即𝑛= 225)。分析处理失败的概率、误报率,以及一个操作需要访问多个缓存行的概率。 

 方法概述:

本文提出前缀过滤器,一种增量过滤器,解决了上述挑战:(1)其空间接近最优,类似于最先进的动态过滤器;(2)查询速度快,与布谷鸟过滤器相当;(3)插入速度快,总体构建时间比向量商滤波器和布谷鸟滤波器分别快1.39×-1.46×和3.2×-3.5×

前缀过滤器具有现代动态过滤器的高级结构(因此具有空间效率),但它利用了删除支持的不足来同时获得快速查询和插入。这种常见的结构是一个散列表,它存储键的短散列值,称为指纹,它们解决散列表冲突的方式不同。例如,布谷鸟过滤器使用布谷鸟散列[39],其插入时间取决于表的占用率,而向量商过滤器使用二选一散列的幂,其插入时间是常数时间。然而,关键的是,这些冲突解决方案会导致每个过滤器查询对负查询执行两次内存访问,通常会导致两次缓存缺失(因为每次内存访问都是对一个随机地址的访问)。

前缀过滤器使用了一种新颖的解决冲突问题的方法,在这种方法中,每个过滤器操作通常只访问一个缓存行。我们的出发点是[6,7]的理论工作,它描述了一种动态空间高效过滤器,我们称之为BE过滤器。简而言之,BE过滤器是一个用于指纹的两级散列表,其中第一级存储了大多数指纹。与布谷鸟散列或二选一的幂散列不同,插入尝试将新密钥的指纹插入到第一级的单个箱子中。如果箱子满了,指纹就会被插入第二级,称为备用。箱子是用一种称为口袋字典(PD)的高效空间数据结构实现的,它采用了Fano-Elias编码[13,24,28]。然而,备用的可以是任何达到高占用率(约95%)且失败率低的散列表方案 

THE PREFIX FILTER

前缀过滤器是一种“指纹哈希表”增量过滤器设计,其特点是其负载平衡方案通常只需要查询和插入来访问单个哈希表箱,即使在高负载因子下。在实际设置中,这个属性转换为需要单次缓存未命中(内存访问)的过滤操作,其中的参数是每个前缀过滤器箱适合于一个缓存行。

前缀过滤器是一个两级结构,每级存储密钥指纹。第一级称为箱子表(bin table),是一个箱子数组,插入的指纹映射到这个箱子中(§4.1)。每个箱子都是一个具有常数时间操作的字典,其容量和元素大小取决于所需的误报率。第二个层次称为备用(spare),是一个增量过滤器,它的范围由关键指纹组成(§4.2)。 

1)First Level: Bin Table

bin表由𝑚个Bin 组成的数组。每个箱子的容量为𝑘,包含来自[𝑠]的元素。𝑚、𝑘和𝑠的值由创建过滤器时指定的数据集大小𝑛和所需的误报率𝜀决定

2)Second Level: The Spare

 确定备用数据集的大小尤其重要:在前缀过滤器的生命周期内转发到备用数据集的指纹数量是一个随机变量,但前缀过滤器必须在创建时提供一些与备用数据集的绑定。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值