`

Bloom Filter 总结

 
阅读更多

1 Overview

    Bloom filter最早由 Burton Howard Bloom提出,是一种用于判断成员是否存在于某个集合中的数据结构。 Bloom filter的判断基于概率论:

  • 如果某个成员存在于集合中,那么Bloom filter不会返回假(即不存在),也就是说false negative是不可能的。
  • 如果某个成员实际上不存在于集合中,Bloom filter可能返回真(即存在),这种情况被称为false positive。

    Bloom filter通常被实现为一个包含 m 位的位数组(bit array),所有位的初始值都为0。 Bloom filter支持以下两种类型的操作:

  • add。将成员添加到Bloom filter中。以该成员为参数调用 k 个索引函数(index functions),得到 k 个位数组的索引值,取值范围是 [0, m), 然后将位数组的对应位设置为1。
  • query。判断某个成员是否已经添加到Bloom filter中。以该成员为参数调用 k 个索引函数,得到 k 个位数组的索引值,然后根据这些索引值检查位数组:当位数组中所有的对应位均为1时,那么认为该成员已经存在。

    如果query的结果为真(即positive),那么实际上存在以下两种可能性:

  • 该成员已经被add到集合中,即该成员的确存在。
  • 该成员未被add到集合中,但是query过程中检查的所有位均被设置为1(由于添加的其它成员导致)。这种情况被称为false positive。

    传统的Bloom filter 不支持从集合中删除成员。对于每个添加到Bloom filter中的成员,实际上将其位数组中的 k 位设置为1。尽管将这些位重置为0可以保证从Bloom filter中删除该成员,但是这样做的副作用是可能会影响某些其它成员,因为其它成员也可能被映射到这些被重置为0的位中的一位或者多位, 从而最终导致false negatives。对于Bloom filter而言,false negatives是不被允许的。 Counting Bloom filter由于采用了计数,因此支持remove操作。

    Bloom filter 使用的 k 个index functions,有时也被称为hash functions,它们通常被假定为彼此独立,返回值在可能的取值范围内均匀分布(这是以下一系列数学证明的基础)。

 

2 The Math

    Bloom filter的基本概念并不复杂,接下来分析一下query操作对某个未被添加的成员返回positive(即false positive)的概率:

    假设p是位数组中某一位为1的概率, 那么false positive的概率是 pk 。如果n是已经添加到Bloom filter中的成员个数,那么 p = 1 – (1 – 1/m)nk,经过一系列推导得到 p 1 – e-kn/m k 当 k = m / n * ln2 时(ln 即 loge ),p为最小值。 例如当k = 8, m/n = 10时, false positive的理论值为0.00846。以下是段计算false positive的实例代码:

 

public static double calculateFalsePositiveProbability(int k, int m, int n) {
	return Math.pow((1 - Math.exp(-k * (double) n  / (double) m)), k);
}

 

 

 

    对于某些应用而言,false positive的概率已经是一个足够好的判断Bloom filter准确性的指标,Peter C.Dillinger 和 Panagiotis Manolios 在其Bloom Filters in Probablistic Verfification的论文中指出,对于query过程中的不确定性, state omission 是一个更合适的指标。建议感兴趣的读者阅读该论文,顺便也可以复习一下相关的数学知识。

 

3 Refinement

    So far, so good。 跟普通的HashMap相比, Bloom filter不需要在内存中保存key和value, 而是位数组中的若干个位即可,这在内存使用上是个巨大的节省,当然前提是能容忍一定概率的false positives。但是传统的Bloom filter存在以下两个严重的缺陷:

  • 为了保证足够低的false positive概率,通常索引函数的个数 k 比较大(例如十几甚至几十,但通常不超过32)。 能找到这么多个random,uniform and independent的索引函数并不是一件容易的事情。
  • 数量众多的索引函数,导致add和query的性能不高。

    Peter C.Dillinger 和 Panagiotis Manolios在其论文中指出,fingerprinting Bloom filter可以有效地减少索引函数的个数,并且对准确性的影响可以小到忽略。这对于传统的Bloom filter来说,是个重大的改进。笔者使用了其中介绍的triple hashing,认为效果比较明显。

 

4 Implementation

    如果Google以Java实现的Bloom filter, java-bloomfilter 可能是最容易找到的实现之一。它采用的是传统的Bloom filter算法:使用的 k 个索引函数(默认都是MD5),只是索引函数在进行计算时对参数的加盐(salting)不同而已。笔者认为 java-bloomfilter 的性能可能有待提升。

    Hadoop common的util包中也提供了一个Bloom Filter的实现,此外其hash包还提供了JenkinsHash 和 MurmurHash 两个Hash算法。笔者感觉Hadoop 的Bloom filter的实现方式类似fingerprinting Bloom filter,但是没有使用double hashing 或者tripple hashing。

    此外关于位数组的实现方式,可能最直接想法的是使用java.util.BitSet。不过笔者认为如果处理的数据量很大、或者性能要求比较高,那么不建议使用java.util.BitSet, 因为java.util.BitSet的内存使用方式、总体性能都不是很理想。

 

 

5 Reference

  1. Bloom Filters in Probablistic Verfification. Peter C.Dillinger and Panagiotis Manolios
  2. Hadoop的Bloom filter实现。http://hadoop.apache.org/common/
  3. java-bloomfilter.  http://code.google.com/p/java-bloomfilter/
分享到:
评论

相关推荐

    Bloom Filter概念和原理

    ### Bloom Filter概念与原理 #### 一、Bloom Filter概述 Bloom Filter是一种高效的数据结构,主要用于快速查询一个元素是否存在于一个集合中。它通过牺牲一定的精确度来换取存储空间的极大节省。Bloom Filter的...

    leveldb中bloomfilter的优化.pdf

    ### Leveldb中Bloom Filter的优化:ElasticBF #### 概述 在现代数据库技术中,**Log-Structured Merge-tree (LSM-tree)** 结构因其高效的写入性能而被广泛应用于各种键值(Key-Value, KV)存储系统中,如Google的*...

    带bloom filter 的c网络爬虫

    - **bloomfilter.h**:这是一个头文件,很可能包含了Bloom Filter的数据结构定义和相关操作函数的声明。在C语言中,头文件通常用于提供接口给其他源文件使用,这里可能是为了在spider.c中方便地调用Bloom Filter的...

    Python-bloomfilter过滤器

    **Python-bloomfilter过滤器详解** Bloom Filter是一种空间效率极高的概率型数据结构,用于判断一个元素是否在一个集合中。在Python开发中,尤其是在处理大量数据时,Bloom Filter可以有效地节省内存空间,尤其适用...

    bloom filter布隆过滤器学习资料大全

    这个压缩包文件“bloom filter布隆过滤器学习资料大全”显然是一个关于布隆过滤器的资源集合,包含了相关的论文和变种总结,对于学习和理解这一技术非常有帮助。 布隆过滤器的核心思想是通过多个哈希函数将元素映射...

    LevelDB Bloom Filter实现1

    引入 Bloom Filter 后,每个 SSTable 文件前会有一个基于 Bloom Filter 的 summary,这个 summary 存储了文件中所有键的紧凑表示。在查询时,首先检查 summary,如果键不在过滤器中,则可以快速确定该键肯定不在该 ...

    Go-bloom-Bloomfilters在Go中的实现

    Bloom Filter是一种空间效率极高的概率型数据结构,用于判断一个元素是否可能在一个集合中。在Go语言中,实现Bloom Filter可以利用其高效并发处理和内存管理的优势,使得这种数据结构在大数据场景下更加实用。本文将...

    Go-Cuckoofilter:在Go中计数bloomfilter的一个更好替换

    总结来说,Go-CuckooFilter是Go语言环境下对Bloom Filter的一种改进,它提供了更高的准确性和灵活性,同时保持了较低的内存占用。对于需要高效查找和删除操作的场景,Go-CuckooFilter是一个非常实用的数据结构选择。...

    BloomFilter——大规模数据处理利器 1

    总结来说,Bloom Filter是一种在大数据处理中节省空间并提高查询效率的工具,尤其适合于对精确性要求不高但需要快速响应的场景。尽管存在误判的可能性,但其巧妙的设计使得它在许多实际应用中成为一种不可或缺的数据...

    bloom filter概念讲解以及代码分析

    bloom_filter 概念讲解与代码...总结来说,Bloom Filter 是一种在有限空间内高效处理大量数据的工具,适合于空间有限且能容忍一定误判的应用场景。通过理解和实现,我们可以更好地掌握其原理,并将其应用于实际项目中。

    RedisBloom v2.2.18

    总结一下,RedisBloom v2.2.18 是一个增强 Redis 功能的扩展模块,它提供了布隆过滤器和 Cuckoo 过滤器的数据结构,能够高效地进行数据去重和存在性检测,适用于需要高并发、低延迟的场景。通过 RedisBloom,开发者...

    Python库 | bloom-0.1.0.tar.gz

    总结来说,bloom-0.1.0是一个专注于Bloom Filter实现的Python库,对于处理大数据、优化查询性能以及节省内存资源等方面具有显著优势。理解并掌握这个库的使用,能够帮助开发者在面对数据密集型任务时,更加游刃有余...

    U201915101刘劲涛_课程报告1

    《大数据存储与管理》课程报告——基于Bloom Filter的设计 一、Bloom Filter基本介绍 Bloom Filter是由Howard Bloom在1970年提出的一种高效的空间节省的数据结构,主要用于判断一个元素是否可能属于一个大规模集合...

    大数据常见处理方法总结.pdf

    总结来说,Bloom Filter和Hashing是大数据处理中的重要工具,它们各自解决了数据存储和查找中的特定问题。在面对海量数据时,理解并灵活运用这些方法对于优化数据处理性能至关重要。在实际应用中,还需要根据问题的...

    U201813729_程丁丁_课程报告1

    报告标题:“U201813729_程丁丁_课程报告1”主要关注基于Bloom Filter的设计实验,旨在深入理解这一数据结构的工作原理及其在实际应用中的性能表现。以下是关于Bloom Filter的详细说明: **一、实验目的** 1. **...

    U201915183周飞_课程报告1

    报告标题:“U201915183周飞_课程报告1”涉及的主题是基于Bloom Filter的设计,这是在《大数据存储与管理》课程中进行的一项学习成果。报告内容涵盖了Bloom Filter的基本原理、理论分析、变体以及相关的性能测试。 ...

    布隆过滤器(bloom filter)及php和redis实现布隆过滤器的方法

    在PHP和Redis中实现布隆过滤器,可以利用PHP的扩展库,如BloomFilter库,或者直接在Redis中使用BF.ADD、BF.MEMBERS和BF.EXISTS等命令操作布隆过滤器。Redis的布隆过滤器模块提供了方便的操作接口,能够在分布式环境...

    U201915085_王子义_课程报告1

    【标题】:"U201915085_王子义_课程报告1" 【描述】:涉及实验环境...总结,这份课程报告通过理论分析和实践操作,深入探讨了Bloom Filter在物联网数据存储与管理中的作用,旨在提升学生对数据结构的理解和应用能力。

Global site tag (gtag.js) - Google Analytics