Java实现布隆过滤器(已爬URL过滤)
来源:互联网 发布:武汉java 开发前景 编辑:程序博客网 时间:2024/05/02 04:39
最近写爬虫需要降低内存的占用,现在用的是HashSet进行已爬URL的过滤,所以想到用布隆过滤器(Bloom Filter)来替换,从而减少内存的开销。因为HashSet内部是由HashMap处理的,HashMap则通过计算一个int型的hash值得出信息指纹,所以一个信息指纹占4字节,但是由于哈希的存储效率一般只有一半,所有说一条URL就需要8字节的信息指纹,而Bloom Filter 则只需要其1/2或更小的信息指纹就可以。
说一下Bloom Filter的工作原理:
假设有一条URL,那么就先建立32个二进制常量(这里个数还可以取其他值,但是误报率会不同,下面会有一张表格显示)。即4字节的向量,然后将这32个二进制位全部设置为0,对于这条URL,用8个不同的随机数产生8个信息指纹,再用一个随机数产生器把这8个信息指纹映射到1到32的8个自然数,并把这些位置置为1。
如果要检测某条URL是否在这个Bloom Filter中,我们仍然用上述8个随机数产生8个信息指纹,并将这8个指纹对应到布隆过滤器的8个二进制位,如果8位都为1,则说明这条URL在这个Bloom Filter中,否则只要有一位不为1,就说明不在。
Bloom Filter绝不会漏掉任何一个重复的URL,但可能会有误报情况,虽然这种可能性很小,上述说的误报概率只有千万分之一,可以通过建立一个小的名单,存储可能误判的URL,并进行比较。
Bloom Filter 误报率表:
最后是代码实现:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
运行结果:
0 0
- Java实现布隆过滤器(已爬URL过滤)
- Java实现布隆过滤器(已爬URL过滤)
- Java实现布隆过滤器(已爬URL过滤)
- 过滤器-过滤URL
- Java 利用过滤器Filter 实现登录过滤
- Java 过滤器读取配置文件实现过滤编码
- 布隆过滤器java实现
- Java过滤器过滤乱码
- java过滤器-双向过滤
- 过滤器多个URl-pattern过滤
- JavaWeb-过滤器高级案例、URL过滤系统
- 布隆过滤器及Java实现
- 布隆过滤器Java实现Demo
- BloomFilter布隆过滤器的java实现
- Java过滤器过滤特殊字符
- 实现布隆过滤器
- url去重 --布隆过滤器 bloom filter原理及python实现
- 详解Spring中的CharacterEncodingFilter过滤器,过滤url请求
- 项目中接入微信tinker时踩的坑
- Android照片墙应用实现,再多的图片也不怕崩溃
- Swift 语法学习总结
- 第3章 shell结构化命令------------(for命令与使用实例)
- FragmentTabHost结合ViewPager使用
- Java实现布隆过滤器(已爬URL过滤)
- C#ListView失去焦点选中行不能高亮显示的问题解决
- PS编辑按钮图片(修改或添加文字等)
- 第14周 oj 2 输入一个数插入有序数组中
- 出栈序列的遍历
- 关于环信集成表情界面不出现的问题?
- Cassandra学习笔记 --- Connection error: ('Unable to connect to any servers', {'127.0.0.1': ...
- Ubuntu下Fcitx和后续搜狗输入法的安装
- ArcEngine开发--网络分析