近日,FaceBook 发布最新研究成果一种新的数据结构 Ribbon 过滤器,与流行的 Bloom 过滤器相比,Ribbon 的空间利用率更高。“Ribbon过滤器的查询时间为O(1),与Bloom过滤器相比,可以节省大约1/3的内存。”
研究过程
Ribbon 过滤器是一种新的数据结构,与广泛用于优化数据检索的流行的Bloom过滤器相比,它的空间效率更高。Bloom过滤器,以及现在的Ribbon过滤器解决实际工程问题的方法之一是提供其他过滤器无法比拟的平滑配置性。Bloom 过滤器的工作原理是过度逼近与某些数据资源相关的一组键。有了Bloom过滤器,几乎所有对该资源的负面查询都可以被跳过(过滤),因为Bloom 过滤器拒绝了几乎所有与该资源不相关的查询键。
通过适当的数据布局和设计,Ribbon过滤器是第一个与Bloom过滤器提供的近乎连续的、无危险的、准确性与空间的权衡相匹配的Bloom替代方案。
在这里,近乎连续是指有效地利用任何数量的内存来表示任何数量的键,这样,浪费的内存(如内部碎片)就可以减少到零。准确度与空间权衡的典型危害是比特排列,其中一些数据大小(例如每个键4、8或16比特)的访问速度比其他的快。与Bloom一样,我们为Ribbon设计的数据布局在访问时间上不会有这种危险,所以它可以更自由地配置。而Ribbon过滤器为空间与时间的权衡增加了新的可配置自由。
在之前的一些研究基础上,Ribbon过滤器结合了一个简化的、更快、更灵活的构造算法;一个为过滤器查询而优化的数据布局;以及近乎连续的可配置性,从而成为静态(不可改变的)Bloom过滤器的实用替代品。
虽然精心设计的Bloom过滤器速度极快,但它们使用的空间(开销)比任意键上的过滤器的信息理论下限多出大约50%。当 Bloom 过滤器不能满足应用程序的空间效率目标时,Ribbon过滤器的变体在空间与时间的权衡中占主导地位,它具有近乎连续的可配置性,空间开销低至1%或更少。Ribbon过滤器的查询时间为O(1),与Bloom过滤器相比,可以节省大约1/3的内存。
它是如何工作的。
就像一些用于完美散列和地图的相关不可变结构一样,Ribbon过滤器是通过解决一个由应用于一组键的散列函数给出的线性系统来构建的。线性系统中的每一行都表达了对某个键的查询,这涉及到对某组数组索引的值进行XOR,必须产生一个规定的值来表明它是 "在 "键的集合中。
尽管使用了布尔--GF(2)--算术,但解决这个逻辑方程组的方法是使用高斯消除法,这从根本上意味着将方程彼此相减,直到你能分离出变量(未知数)。如果存在解决方案,这种方法会找到它。
Ribbon这个名字有双重含义。首先,我们使用Dietzfelbinger和Walzer的一个线性系统,其排序的系数矩阵类似于物理上的丝带,或波浪形的带状矩阵的近似值。高斯消除法在这个系统上根本上是更有效的,因为它已经接近于一个简化的形式。
Ribbon也是 Rapid Incremental Boolean Banding ON the fly 的缩写,这是我们快速而灵活的新高斯求解器的名字。通过一种类似于插入线性探测哈希表的方法,Ribbon在飞行中进行高斯消解。这在构造上节省了时间和空间,因为行的减少可以在寄存器中而不是在内存中完成,而且带状系数矩阵的减少形式--带状矩阵--比明确表示带状形式更节省空间。即时构建也为Ribbon方法的核心挑战提供了解决方案:将其空间效率扩展到非常多的键。
它为什么重要。
在Facebook的规模下,我们预计Ribbon过滤器可以节省几个百分点的RAM资源,对于一些主要的存储系统来说,CPU的使用率会有微小的增加。然而,我们不会以所有的工程成本来实现效率的提高,所以拥有一个用户友好的数据结构也很重要。这个问题使其他提供一些空间节约的Bloom替代品的实施停滞不前。
Ribbon过滤器开启了这些新的权衡,而没有在配置空间中引入明显的不连续或危险。换句话说,要使Ribbon过滤器具有通用性和高度可配置性,有一定的复杂性,但这些细节可以隐藏在一个相对简单的API后面。你基本上可以自由选择四个核心性能维度中的任何三个--添加到集合中的键的数量、内存使用、CPU效率和准确性--而且准确性会自动得到很好的优化。