google guava bloom filter包的坑
来源:互联网 发布:农业部渔船数据科 编辑:程序博客网 时间:2024/06/06 04:41
关于bloom filter以及原理,见我之前转的这篇:
http://blog.csdn.net/inte_sleeper/article/details/7824857
下面开始实战篇。google guava包是包含了一个bloom filter的实现的,使用方式比较简单,其实就是一行代码:
BloomFilter<CharSequence> filter = BloomFilter.create(Funnels.stringFunnel(), 10000000, 0.001F);
上面的代码创建了一个以string为key的bloom filter,预期的插入量是1KW,错误率是0.1%。
查询的时候,直接调 filter.mightContain()方法就可以,非常简单。
下面开始说坑吧。guava的BloomFilter,内部的一段实现代码如下:
public static <T> BloomFilter<T> create(Funnel<T> funnel, int expectedInsertions, double falsePositiveProbability) { checkNotNull(funnel); checkArgument(expectedInsertions >= 0, "Expected insertions cannot be negative"); checkArgument(falsePositiveProbability > 0.0 & falsePositiveProbability < 1.0, "False positive probability in (0.0, 1.0)"); if (expectedInsertions == 0) { expectedInsertions = 1; } int numBits = optimalNumOfBits(expectedInsertions, falsePositiveProbability); int numHashFunctions = optimalNumOfHashFunctions(expectedInsertions, numBits); return new BloomFilter<T>(new BitArray(numBits), numHashFunctions, funnel, BloomFilterStrategies.MURMUR128_MITZ_32);}
它会根据预期的插入量以及错误率,计算出numBits,即需要的位数。然后使用BitArray创建出numBits的数据位,BitArray的最大size=int.MAX_VALUE(约21亿)。
然后根据预期插入量以及计算出的numBits计算出最优的哈希函数个数。其实这里并不能说是最优,只是根据这两个参数做出的一种平衡。
这时候,千万别认为你可以将预期插入量设为21亿。事实上,你可以尝试一下,将预期插入量这个参数值从2亿慢慢增加至10亿,你会发现,内存占用都是一样的(试验前,请先调整JVM的-Xmx参数)。接下来我们看看在不同的参数条件下,numBits值以及numHashFunctions值的变化:
expectedInsertionsfalsePositiveProbabilitynumBitsnumHashFunctions6KW0.00011150207005131亿0.00011917011675132亿0.0001214748364775亿0.000121474836473从上面的表格可以看到,在0.0001的错误率下,插入量不到1.5亿的时候,numBits已经到达了BitArray的最大容量了,这时如果再增加插入量,哈希函数个数就开始退化。到5亿的时候,哈希函数个数退化到了只有3个,也就是说,对每一个key,只有3位来标识,这时准确率就会大大下降。
这时有两种解决方案:
第一种当然就是减少预期插入量,1亿以内,还是可以保证理论上的准确率的。
第二种,如果你的系统很大,就是会有上亿的key,这时可以考虑拆分,将一个大的bloom filter拆分成几十个小的(比如32或64个),每个最多可以容纳1亿,这时整体就能容纳32或64亿的key了。查询的时候,先对key计算一次哈希,然后取模,查找特定的bloom filter即可。
- google guava bloom filter包的坑
- 对google黑板报Bloom Filter的补充
- google Guava包的ListenableFuture解析
- google Guava包的ListenableFuture解析
- google Guava包的ListenableFuture解析
- bloom filter的使用价值
- Bloom Filter 原理及 Google BloomFilter
- Google-Guava: Concurrent包里的Service框架
- bloom filter的开源实现程序memcached bloom filter
- Bloom filter的若干证明
- Bloom Filter 数据结构的应用
- Bloom Filter 数据结构的应用
- 传说的Bloom Filter源代码
- bloom filter 的Java 版
- bloom filter 的Java 版
- bloom filter的数据统计
- bloom filter 的Java 版
- Bloom Filter存在的意义
- 0,"0",undefined,null,false在JS中的判断方式
- Linux启动ftp服务器530 Permission denied解决方法
- 个人开公司的流程——以后可能用得着
- iOS笔记-- 多线程应该知道的那几件事 GCD NSThread NSOperation
- ASP.NET中关于路径的那些事
- google guava bloom filter包的坑
- 技术牛人---章文嵩博士---做系统要先了解业务的需求
- 抬脚第一挪
- 例说模板方法模式(Template Method Pattern)
- 实现画图板的基本框架与界面
- Code Sign error: Application Identifier 'xxx' which doesn't match the current setting 'xxx'
- sizeof()用法汇总
- JNI
- 技术牛人---章文嵩博士---阿里副总裁章文嵩:淘宝基础设施构建实践