何时使用Bloom过滤器以及何时在处理非常大的数据时使用BitMap?

问题描述 投票:1回答:2

我正在学习Bloom filterBitMap(也称为Bit Array)并遇到一个问题,有人可以给我一些关于何时使用Bloom过滤器以及何时使用BitMap的说明?

根据我的理解,我认为当我们需要找到最大的数字或想要对大数据进行排序时,BitMap更适合(对于纯数字)。

如果我们想检查一些IP地址是否包含在数十亿现有记录中,那么Bloom过滤器更适合(对于字符串或其他非纯数字)。

但是,我想有人给我更详细的说明或建议,我在Google上搜索过,但没有找到一些有用的信息。提前致谢!

另外我不知道是否应该将此问题放在stackoverflow或其他网站上,如果它不是正确的网站,希望有人可以指出,谢谢!

algorithm bit bitset bloom-filter
2个回答
2
投票

何时使用Bloom filter:如果您有一个集合(唯一条目列表)和一个哈希函数,您可以创建一个Bloom过滤器。它允许类型“可能在集合中输入x?”的查询。如果条目在集合中,则查询将返回true。对于不在集合中的条目,它可能返回true,概率很低,通常为1%或更低(取决于Bloom过滤器的大小)。您可以根据需要使Bloom过滤器尽可能小,但是对于大约1%的误报率,每个条目需要大约10位。存在使用较少空间的替代算法/数据结构,参见例如https://github.com/FastFilter。 Bloom过滤器内部使用位数组。

何时使用bit array(也称为bitset):如果条目是0..n之间的数字,则可以使用位数组,如下所示:为每个条目设置位x。这将需要n位(无论有多少条目)。因此,如果您的条目可能是大数字,那么就会出现问题:它会占用大量内存。但是,您可以创建一个稀疏位数组(也称为压缩位数组),例如,使用https://roaringbitmap.org/。与Bloom过滤器一样,您不会有误报,但是大小的使用在很大程度上取决于您的数据(在您拥有的数字上),远远超过Bloom过滤器。


0
投票

来自This Link的ANSwer

来自Wikipedia

与用于表示集合的其他数据结构相比,布隆过滤器具有强大的空间优势,例如自平衡二进制搜索树,尝试,哈希表或简单数组或条目的链接列表。其中大多数都要求至少存储数据项本身,这可能需要从少量位到小整数,到任意数量的位,例如字符串(尝试是一个例外,因为它们之间可以共享存储)具有相同前缀的元素)。链接结构会为指针带来额外的线性空间开销。另一方面,具有1%误差和最佳值k的布隆过滤器每个元素仅需要大约9.6位 - 无论元素的大小如何。这种优势部分来自于其紧凑性,继承自阵列,部分来自其概率性质。如果1%的误报率似乎太高,每次我们每个元素添加大约4.8位时,我们将它减少十倍。

对我来说很清楚。

布隆过滤器不会存储元素本身,这是关键点。你不使用布隆过滤器来测试一个元素是否存在,你用它来测试它是否肯定不存在,因为它保证没有假阴性。这使您无需为集合中不存在的元素(例如磁盘IO查找它们)执行额外的工作。

而且所有这些空间都远远少于哈希表(对于大型数据集可能部分在磁盘上)。虽然您可以将布隆过滤器与哈希表之类的结构结合使用,但一旦您确定该元素有可能存在。

因此,示例使用模式可能是:

你在磁盘上有很多数据 - 你决定你想要的错误限制(例如1%),它规定了m的值。然后确定最佳k(根据文章中给出的公式)。您可以从此磁盘绑定数据中填充一次过滤器。

现在你有了RAM中的过滤器。当您需要处理某个元素时,您会查询过滤器以查看它是否有可能存在于您的数据集中。如果没有,则不会进行额外的工作。没有磁盘读取等(如果它是一个哈希或树,你将不得不这样做)。

否则,如果过滤器显示“是,它就在那里”,则有1%的可能性是错误的,所以你做了必要的工作才能找到答案。 99%的时间,它真的会在那里,所以这项工作并非徒劳无功。

© www.soinside.com 2019 - 2024. All rights reserved.