布隆过滤器

布隆过滤器之Python+Redis

我的未来我决定 提交于 2019-12-16 15:52:54
简单的python实现 pip install mmh3 对于安装报错,c++编译错误问题:可以安装 Microsoft Visual C++ Build Tools() 例子转载(https://www.cnblogs.com/naive/p/5815433.html) from bitarray import bitarray # 3rd party import mmh3 class BloomFilter(set): def __init__(self, size, hash_count): super(BloomFilter, self).__init__() self.bit_array = bitarray(size) self.bit_array.setall(0) self.size = size self.hash_count = hash_count def __len__(self): return self.size def __iter__(self): return iter(self.bit_array) def add(self, item): for ii in range(self.hash_count): index = mmh3.hash(item, ii) % self.size self.bit_array[index] = 1

布隆过滤器原理及实现

こ雲淡風輕ζ 提交于 2019-12-16 03:37:53
1.布隆过滤器的使用价值 有时候我们需要判断一个元素是否在一个集合中。比如,在字处理软件中,需要检查一个单词是否拼写正确(也就是要判断它是否在已知的字典里);在警察系统中,一个嫌疑人的名字是否出现在嫌疑名单上;在网络爬虫里,一个网址是否已经被访问过,等等。 最直接的方法就是讲集合中的元素存在计算机中,遇到一个新元素时,将它和集合中的元素直接比较即可。一般来讲,计算机中的集合是用哈希表(Hash Table)来存储的。它的好处是快速准确,缺点是耗费存储空间。 为什么说耗费存储空间呢?其根本原因是哈希表方法需要把实实在在的具有特定长度(每个Email地址对应成一个8字节的信息指纹)的元素的信息指纹存储在内存或硬盘中的哈希表中,这个存储量在实际应用中一般是相当大的。比如每存储一亿个Email地址,需要0.8G大小的数字指纹存储空间,考虑到哈希表的存储空间利用率一般只有一半,所以需要1.6G的存储空间。如果存储几十亿上百亿的Email地址,那就需要百亿字节的内存存储空间。 而布隆过滤器只需要哈希表1/8到1/4的大小就能解决同样的问题,它实际上是一个很长的二进制向量和一系列的随机映射函数。 下面以WEB页面地址的存储为例来说明布隆过滤器的工作原理。 假定存储一亿个WEB页面地址,先建立一个16亿二进制(比特),即2亿字节的向量,然后将这16亿个二进制位清零。对于每一个WEB页面地址X

Bloom Filter布隆过滤器原理和实现(1)

若如初见. 提交于 2019-12-11 07:48:52
引子 《数学之美》介绍布隆过滤器非常经典: 在日常生活中,包括设计计算机软件时,经常要判断一个元素是否在一个集合中。比如: 在字处理软件中,需要检查一个英语单词是否拼写正确(也就是要判断它是否在已知的字典中); 在FBI,一个嫌疑人的名字是否已经在嫌疑犯的名单上; 在网络爬虫里,一个网站是否已访问过; yahoo, gmail等邮箱垃圾邮件过滤功能,等等 ... 以上场景需要解决的共同问题是: 如何查看一件事物是否在有大量数据的集合里 。 通常的做法有以下几种思路: 数组、 链表、 树、平衡二叉树、Trie map (红黑树) 哈希表 上面这几种数据结构配合一些搜索算法是可以解决数据量不大的问题,但当集合里面的数据量非常大的时候,就会出现问题。比如:有500万条记录甚至1亿条记录?这个时候常规的数据结构的问题就凸显出来了。数组、链表、树等数据结构会存储元素的内容,一旦数据量过大,消耗的内存也会呈现线性增长,最终达到瓶颈。哈希表查询效率可以达到O(1)。但是哈希表需要消耗的内存依然很高。使用哈希表存储一亿 个垃圾 email 地址的消耗?哈希表的做法:首先,哈希函数将一个email地址映射成8字节信息指纹;考虑到哈希表存储效率通常小于50%(哈希冲突);因此消耗的内存:8 * 2 * 1亿 字节 = 1.6GB 内存。因此,存储几十亿个邮件地址就可能需要上百GB的内存

详解布隆过滤器的原理,使用场景和注意事项

↘锁芯ラ 提交于 2019-12-10 10:45:08
什么是布隆过滤器 本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在” 。 相比于传统的 List、Set、Map 等数据结构,它更高效、占用空间更少,但是缺点是其返回的结果是概率性的,而不是确切的。 实现原理 HashMap 的问题 讲述布隆过滤器的原理之前,我们先思考一下,通常你判断某个元素是否存在用的是什么?应该蛮多人回答 HashMap 吧,确实可以将值映射到 HashMap 的 Key,然后可以在 O(1) 的时间复杂度内返回结果,效率奇高。但是 HashMap 的实现也有缺点,例如存储容量占比高,考虑到负载因子的存在,通常空间是不能被用满的,而一旦你的值很多例如上亿的时候,那 HashMap 占据的内存大小就变得很可观了。 还比如说你的数据集存储在远程服务器上,本地服务接受输入,而数据集非常大不可能一次性读进内存构建 HashMap 的时候,也会存在问题。 布隆过滤器数据结构 布隆过滤器是一个 bit 向量或者说 bit 数组,长这样: 如果我们要映射一个值到布隆过滤器中,我们需要使用 多个不同的哈希函数 生成 多个哈希值, 并对每个生成的哈希值指向的 bit 位置 1,例如针对值 “baidu”

布隆过滤器

五迷三道 提交于 2019-12-10 06:01:36
redis中采用布隆过滤器辅助存储在磁盘中的索引,加速了数据查找效率 布隆过滤器具有一定的判错率。对于判定存在的数据,有可能并不存在,但是对于判定不存在的数据,那肯定就不存在。而且,布隆过滤器还有一个更大的特点,那就是内存占用非常少。可以针对数据,构建一个布隆过滤器,存储在内存中。当要查询数据的时候,可以先通过布隆过滤器,判定是否存在。如果通过布隆过滤器判定数据不存在,那就没有必要读取磁盘中的索引了。加速了数据不存在情况的查询效率。 来源: CSDN 作者: 喵了个咪的回忆丶 链接: https://blog.csdn.net/dl674756321/article/details/103458736

布隆过滤器

三世轮回 提交于 2019-12-09 18:35:03
from .defaults import BLOOMFILTER_BIT, BLOOMFILTER_HASH_NUMBERclass HashMap(object): def __init__(self, m, seed): self.m = m self.seed = seed def hash(self, value): """ Hash Algorithm :param value: Value :return: Hash Value """ ret = 0 for i in range(len(value)): ret += self.seed * ret + ord(value[i]) return (self.m - 1) & retclass BloomFilter(object): def __init__(self, server, key, bit=BLOOMFILTER_BIT, hash_number=BLOOMFILTER_HASH_NUMBER): """ Initialize BloomFilter :param server: Redis Server :param key: BloomFilter Key :param bit: m = 2 ^ bit :param hash_number: the number of hash function

海量数据解决方案~

社会主义新天地 提交于 2019-12-08 18:51:34
题目 问题一:现有海量日志数据,要提取出某日访问百度次数最多的那个IP(可以将题干简化,假设日志中仅包含IP数据,也就是说待处理的文件中包含且仅包含全部的访问IP,但内存空间有限,不能全部加载,假设只有512MB) 解决方案: 这是一道典型的分治思想的题目,这种问题处理起来套路比较固定,对于大部分的数据量比较大的前提的问题而言,分治都是一个可选的解决方案,但不一定是最优的,解决方法基本划分为三步走: 第一:如何有效的划分数据 第二:如何在子集上解决问题 第三:如何合并结果 那么对于本问题就显得比较明显了: 首先解决如何划分,由于IP地地址范围从000.000.000.000~255.255.255.255共有2^32个大约4GB,那么我们可以通过取模的方式进行划分,直接将四段数据相连就得到一个IP对应的数字A,再对A模1024(模数取多少可以自己指定,保证每个小文件能被放到内存就好),这样大文件被划分成小文件了,并且相同的IP一定被划分到相同的文件中。 其次解决每个小文件中TOP1的问题: 这里可以用很多方式进行处理,比如你可以构造自己的HashMap,key为IP,value为当前出现次数,最后找到value最大的Key即为当前文件中出现次数最多的IP。 最后要解决结果合并问题: 这里直接将1024个子文件的统计结果进行比较就好,不用排序,直接选择最大的一个就好。 注意

浅析海量数据处理问题

百般思念 提交于 2019-12-08 17:52:55
生活中我们经常会遇到一些海量数据处理的问题,那么怎样的问题就算是海量数据了呢?来看以下这几个问题: 给定一个大小超过 100G 的文件, 其中存在 IP 地址, 找到其中出现次数最多的 IP 地址 。 给定100亿个整数, 找到其中只出现一次的整数(位图变形, 用两位来表示次数)。 有两个文件, 分别有100亿个query(查询词, 字符串), 只有1G内存, 找到两个文件的交集。 给上千个文件, 每个文件大小为1K - 100M, 设计算法找到某个词存在在哪些文件中。 首先第一个问题很明确有100G的数据;第二个问题100亿个整数所占的空间大小是:100亿*4byte = 40G;第三个问题100亿也就是10G……要知道我们日常使用的电脑也就是4G、8G的内存大小,远不能满足这里的100G、40G……的数据处理的需求。但是我们又必须要处理类似这样的问题,难道就束手无策了么!!! 为了解决类似这样的问题,我们可以借助之前学的哈希表,位图,布隆过滤器这样的数据结构,接下来我们来了解一下相关知识。 哈希表 详情请移步: 哈希表 位图 详情请移步: 位图 布隆过滤器 详情请移步: 布隆过滤器 哈希切分 所谓的切分就很好理解,就是将一个东西切分开,将一个整体划分为多个更小的小整体。那么这里的哈希切分又是什么操作呢?提到哈希我们就要想到这其中使用了哈希函数,同样 的哈希切分

【原创!推荐!】不了解布隆过滤器?一文给你整的明明白白!

我只是一个虾纸丫 提交于 2019-12-06 12:21:46
海量数据处理以及缓存穿透这两个场景让我认识了 布隆过滤器 ,我查阅了一些资料来了解它,但是很多现成资料并不满足我的需求,所以就决定自己总结一篇关于布隆过滤器的文章。希望通过这篇文章让更多人了解布隆过滤器,并且会实际去使用它! 下面我们将分为几个方面来介绍布隆过滤器: 什么是布隆过滤器? 布隆过滤器的原理介绍。 布隆过滤器使用场景。 通过 Java 编程手动实现布隆过滤器。 利用Google开源的Guava中自带的布隆过滤器。 Redis 中的布隆过滤器。 1.什么是布隆过滤器? 首先,我们需要了解布隆过滤器的概念。 布隆过滤器(Bloom Filter)是一个叫做 Bloom 的老哥于1970年提出的。我们可以把它看作由二进制向量(或者说位数组)和一系列随机映射函数(哈希函数)两部分组成的数据结构。相比于我们平时常用的的 List、Map 、Set 等数据结构,它占用空间更少并且效率更高,但是缺点是其返回的结果是概率性的,而不是非常准确的。理论情况下添加到集合中的元素越多,误报的可能性就越大。并且,存放在布隆过滤器的数据不容易删除。 位数组中的每个元素都只占用 1 bit ,并且每个元素只能是 0 或者 1。这样申请一个 100w 个元素的位数组只占用 1000000 / 8 = 125000 B = 15625 byte ≈ 15.3kb 的空间。 总结: 一个名叫 Bloom

【浅析】|白话布隆过滤器BloomFilter

无人久伴 提交于 2019-12-06 10:11:01
通过本文将了解到以下内容: 查找问题的一般思路 布隆过滤器的基本原理 布隆过滤器的典型应用 布隆过滤器的工程实现 场景说明: 本文阐述的场景均为普通单机服务器、并非分布式大数据平台,因为在大数据平台下问题就是另外一种考虑方式了,因此本文只描述贫穷落后一穷二白的场景,俨然有种60年代先辈们在戈壁攻克原子弹的感觉。 1.查找问题的一般思路 查找问题是出现频率极高的问题,来看一道面试题: 给你A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找出A,B文件所有共同的URL。 一般思路:面对一般的问题,根据不同的数据规模,转换为计算机问题之后就落地到实际的数据结构: 线性结构:数组、链表、 容器结构:集合、Map、HashTable 树形结构:AVL、RBTree、BTree 但是上述的结构都是将待查找数据直接存储,如果是大数据量,这样虽然保证了准确性但是空间消耗会非常大,实际是不可行的。 苛求条件下的思路: 把待查数据进行信息无缺失地压缩 这句话的意思就是:对于公民可以使用身份证来独立唯一表示此个体,而无需太多诸如性别、出生日期、出生地、履历等描述,这种转换就相当于在信息无缺失的情况下,使用更少的特征来表示。还有一个例子就是:文言文往往篇幅很短,翻译为白话文可能很长,所以文言文就可以认为是白话文的信息无缺失压缩。