BloomFilter原理和使用

2024-08-28 22:58
文章标签 使用 原理 bloomfilter

本文主要是介绍BloomFilter原理和使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • BloomFilter原理和使用
    • BloomFilter原理
      • 适用场景
      • 基础性质
      • False-Positive推导
    • Bloom Filter之python包
      • pybloomfilter
    • pybloomfilter代码实例

BloomFilter原理和使用

BloomFilter原理

适用场景

在很多场景下,会遇到流式元素的处理,最主要的是集合判断与去重问题。例如我们会判断一个email地址是否在黑名单中,网络爬虫会判断一个url是否已经存在于待抓取列表或者已抓取,视频库的去重等等。不幸的是通常情况下这类问题面临的数据规模都较大,比如网络爬虫系统的抓取url通常达到数亿级别,如果采用哈希表存储这些url将会耗费大量的内存以至于在实际生产使用过程中几乎不可用,而布隆滤波器确实一种近乎完美的替代方案。(谨记:大部分的近似方案虽然会带来少量的损失,但是会给性能和效果带来极大的提升)

在个人研究方面,有一个场景需要对item进行流式处理,最主要的操作便是查询是否已经存在,由于需要查询的信息量较大,且需要在分布式场景下进行全局状态维护,为了降低分布式维护信息的量,减少通信代价,故希望采用bloom filter期待有所作用。

本实验目前采用最基础的bloom filter的形式,暂不深入研究bloom filter各种拓展形式。

基础性质

布隆过滤器(Bloom Filter)是由布隆(Burton Howard Bloom)在1970年提出的。它实际上是由一个很长的二进制向量和一系列随机映射函数组成,布隆过滤器可以用于检索一个元素是否在一个集合中。

文章:Space/Time Trade-offs in Hash Coding with Allowable Errors

布隆滤波器会有一个m位的bit数组(每位初始设为0)以及k个随机哈希函数,每个哈希函数的输出都是一个(0,m-1)之间的一个数(对应bit数组下标)。

添加操作:输入x,对于每一个哈希函数,计算j= hash(x),将m_bit[j] 设成1;

查询操作:输入x,对于每一个哈希函数,计算j= hash(x),如果m_bit[j] 不等于1,则说明x不在集合中,否则如果k个函数的映射位都为1,说明x存在于集合中。

优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率(假正例False positives,即Bloom Filter判断某一元素存在于某集合中,但是实际上该元素并不在集合中)和删除困难,但是没有识别错误的情形(即假反例Falsenegatives,如果某个元素确实没有在该集合中,那么Bloom Filter 是不会报告该元素存在于集合中的,所以不会漏报)。

False-Positive推导

假设k个哈希函数完全随机,即以等概率选在(0,m-1)中的一个数,那么m_bit中某一位在添加元素时一次哈希没有被置位的概率是:

在这里插入图片描述

经过k次哈希没有被置位的概率是:

在这里插入图片描述

添加n个元素该位仍然没有被置位的概率是:

在这里插入图片描述

那么该位在添加n个元素后被置位的概率是:

在这里插入图片描述

现在对于一个新元素,要判断其是否在集合中,如果判断该元素存在于集合中,说明k个哈希位都为1,但是有可能会错误的把实际不存在于集合中判断为存在于集合中(False Positive),该事件发生的概率为:

在这里插入图片描述

可以看出随着m(位数组大小)的增加,False Positive概率会下降,同时随着插入元素个数 n 的增加,False Positives的概率又会上升。

对于给定的m、n,哈希函数的个数k的最优值为:

在这里插入图片描述

在这里插入图片描述

对于给定的False Positives概率 p和元素个数n,位数组m的最优值为:

在这里插入图片描述

Bloom Filter之python包

  • pybloom
  • pybloom_live
  • pybloomfilter

这里仅介绍pybloomfilter的安装与使用

pybloomfilter

Pybloomfilter是一个用java实现的bloomfilter版本,为了兼顾效率,内部位数组使用C实现。

Pybloomfilter构造时允许传入capacity(即n),error rate,位数组大小(m),哈希函数个数(即k)以及一个序列化的nmap文件。

官方文档:http://axiak.github.io/pybloomfiltermmap/ (需要开全局代理,否则可能被墙)

下载地址:https://github.com/axiak/pybloomfiltermmap

在ubuntu中可以直接使用命令安装:sudo pip install pybloomfiltermmap

在安装过程中出现如下问题(不管是下载后编译安装还是直接使用命令安装):

在这里插入图片描述

发扬曾经学到优良传统,遇到错误首先应该分析出错返回的结果,然后根据理解再去找问题。

这里发现是编译的时候有相关的c库找不到,于是开始谷歌:

真正解决问题的博客:https://blog.csdn.net/yingyujianmo/article/details/49634511

在ubuntu上安装软件时,经常出现这样的问题:

/usr/bin/ld: cannot find -l****

问题解决办法,详细内容参考上述博客。

另外还有一种常见解决方案,为给出博文的第一种,不过此处并没有解决问题:http://blog.51cto.com/eminzhang/1285705

核心问题在于该库是存在的,但是名称有所变化,需要增加一个软链接:

具体操作:

首先定位问题,使用命令:locate libcrypto查看,发现 libcrypto.so.XXX 是存在的,但是libcrypto.so是不存在。

在这里插入图片描述

因此进入对应的文件夹,建立对应的软链接:

w@ubuntu:/lib/x86_64-linux-gnu$ sudo ln -s libcrypto.so.1.0.0 libcrypto.so

问题解决

类似的/usr/bin/ld: cannot find -l****问题都可以通过这种方法解决。

进而使用命令编译安装pybloomfilter

w@ubuntu:~/Desktop/pybloomfiltermmap-master$ sudo python setup.py install

成功!

另外,使用如下命令安装pybloomfilter,安装貌似没有问题,但是无法使用,会出现错误:

pip install pybloomfilter

运行时出现错误:

在这里插入图片描述

应该是缺少了某C语言相关的包,之后尝试pybloom包,可以运行,API接口和pybloomfilter不太一样,速度上估计也慢一些,似乎还有一些不准确,这里主要使用pybloomfilter

pybloomfilter代码实例

#! /usr/bin/env python
# -*- coding:utf-8 -*-import os
import sys
reload(sys)
sys.setdefaultencoding('utf-8')import randomfrom pybloomfilter import BloomFilter# 创建一个capacity等于100万,error rate等于0.001的bloomfilter对象
bfilter = BloomFilter(1000000,0.001,'bf_test.bloom')# 添加100个元素
for x in xrange(1000000):bfilter.add(str(x))# 与nmap文件同步
bfilter.sync()# 测试error rate
error_in = 0
for x in xrange(2000000):if str(x) in bfilter and x > 1000000:error_in += 1print "error_rate:%s" % (error_in*1.0/1000000)

输出结果为:

在这里插入图片描述

与0.001的既设值很接近,还是非常精确且值得信赖的。

关于API还需要进一步学习总结,以及在图划分的实际测试结果,见后续博客。

这篇关于BloomFilter原理和使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1116126

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的