zoukankan      html  css  js  c++  java
  • 布隆过滤器

    一 布隆过滤器简介

    bloomfilter:是一个通过多哈希函数映射到一张表的数据结构,能够快速的判断一个元素在一个集合内是否存在,具有很好的空间和时间效率。(典型例子,爬虫url去重)

    原理: BloomFilter 会开辟一个m位的bitArray(位数组),开始所有数据全部置 0 。当一个元素过来时,能过多个哈希函数(h1,h2,h3....)计算不同的在哈希值,并通过哈希值找到对应的bitArray下标处,将里面的值 0 置为 1 。

    关于多个哈希函数,它们计算出来的值必须 [0,m) 之中。

    例子:

    有这么一个网址

    假设长度为 20的bitArray,通过 3 个哈希函数求值。如下图:

    timg

    另外说明一下,当来查找对应的值时,同样通过哈希函数求值,再去寻找数组的下标,如果所有下标都为1时,元素存在。当然也存在错误率。(如:当数组全部为1时,那么查找什么都是存在的),但是这个错误率的大小,取决于数组的位数和哈希函数的个数。

    二 Python中使用布隆过滤器

    1.安装
    #需要先安装bitarray
    pip3 install bitarray-0.8.1-cp36-cp36m-win_amd64.whl(pybloom_live依赖这个包,需要先安装)
    #下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/
    pip3 install pybloom_live
    2.BloomFilter使用(自动扩容版本)
    from pybloom_live import ScalableBloomFilter
    bloom = ScalableBloomFilter(initial_capacity=100, error_rate=0.001, mode=ScalableBloomFilter.LARGE_SET_GROWTH)  #capacity是容量, error_rate 是能容忍的误报率
    url = "www.cnblogs.com"
    url2 = "www.xxxxxx.top"
    bloom.add(url)
    print(url in bloom)
    print(url2 in bloom)
    
    3.BloomFilter 是定长的
    from pybloom_live import BloomFilter
    bf = BloomFilter(capacity=1000)
    url='www.baidu.com'
    bf.add(url)
    
    print(url in bf)
    
    print("www.xxxxxx" in bf)
    

    3.redis实现布隆过滤器

    3.1RedisBloom需要先进行安装,推荐使用Docker进行安装,简单方便

    1.docker 安装
    	docker pull redislabs/rebloom:latest
    	docker run -p 6379:6379 --name redis-redisbloom redislabs/rebloom:latest
    	docker exec -it redis-redisbloom bash
    	# redis-cli
    	# 127.0.0.1:6379> bf.add xiaoyuanqujing hello
    2.直接编译
    	git clone https://github.com/RedisBloom/RedisBloom.git
        cd RedisBloom
        make //编译 会生成一个rebloom.so文件
        redis-server --loadmodule /path/to/rebloom.so
        redis-cli -h 127.0.0.1 -p 6379
    

    3.2 基本命令

    bf.add 添加元素到布隆过滤器
    bf.exists 判断元素是否在布隆过滤器
    bf.madd 添加多个元素到布隆过滤器,bf.add只能添加一个
    bf.mexists 判断多个元素是否在布隆过滤器
    
    ex:
        > bf.add rurl www.baidu.com
        > bf.exists rurl www.baidu.com
        > bf.madd rurl www.sougou.com www.jd.com
        > bf.mexists rurl www.jd.com www.taobao.com
    

    布隆过滤器在第一次add的时候自动创建基于默认参数的过滤器,Redis还提供了自定义参数的布隆过滤器。

    在add之前使用bf.reserve指令显式创建,其有3个参数,key,error_rate, initial_size,错误率越低,需要的空间越大,error_rate表示预计错误率,initial_size参数表示预计放入的元素数量,当实际数量超过这个值时,误判率会上升,所以需要提前设置一个较大的数值来避免超出。

    默认的error_rate是0.01,initial_size是100。

    利用布隆过滤器减少磁盘 IO 或者网络请求,因为一旦一个值必定不存在的话,我们可以不用进行后续昂贵的查询请求。

    3.3 RedisBloom使用

    import redis
    client = redis.Redis()
    size = 10000
    count = 0
    client.execute_command("bf.reserve", "lqz", 0.001, size) # 新增
    for i in range(size):
        client.execute_command("bf.add", "lqz", "xxx%d" % i)
        result = client.execute_command("bf.exists", "lqz", "xxx%d" % (i + 1))
        if result == 1:
            print(i)
            count += 1
    print("size: {} , error rate: {}%".format(size, round(count / size * 100, 5)))
    
    永远不要高估自己
  • 相关阅读:
    网络管理 之 Fedora Core 网络配置工具systemconfignetwork介绍
    文件系统管理 之 在Fedora core 4.0 加载NTFS和FAT32分区详述
    系统引导管理 之 系统引导管理器GRUB,为初学者指南
    文件系统管理 之 reiserfs文件系统反删除(Undelete)操作的实践
    文件系统管理 之 Linux 文件系统概述
    安装配置管理 之 apt+synaptic 为Fedora core 4.0 中安装Nvida芯片显示卡及Ati 卡显示驱动
    安装配置管理 之 安装和配置 JPackage Java
    安装配置管理 之 Fedora 6.0 蓝牙bluebooth传送文件的问题解决方法
    软件包管理 之 关于Fedora Core 5.0 通过Yum在线升级说明
    软件包管理 之 文件解压缩
  • 原文地址:https://www.cnblogs.com/liqiangwei/p/14457281.html
Copyright © 2011-2022 走看看