布隆过滤器速度_布隆过滤器,简易实验报告 --- 咋判断百万级千万级甚至亿级数据中某元素是不存在的?速度快,占内存少...

理论部分来自于一个接地气文章(除了讲了很好的故事外,还介绍了 Google 的 guava 是咋实现布隆过滤器的)http://www.cnblogs.com/crossoverJie/p/10018231.html

1 布隆过滤器作用: 判断大规模数据中,某元素是否存在。

某元素判定为不存在,100%准确

某元素判定为存在,若误报率设定为0.01,则99%是准确的。布隆过滤器无法保证此项判断100%准确。(你把下面代码里的0.01设定成0试试?)

2 guava 的布隆过滤器 vs. java集合框架中的 HashSet

下面的测试在我的2012年老笔记本电脑上进行的。

布隆过滤器(误报率设定为0.01) VS HashSet

数据规模

布隆过滤器(代码1)用时

HashSet(代码2)用时

10

30ms

0

100

30ms

0

1000

60ms

0

1万

100ms

10ms

10万

180ms

40ms

100万

700ms

950ms

1000万

6s 难以忍受

10秒

1亿

56s 无法忍受了

崩溃

上表仅仅在耗时上做比较,耗费内存方面没做比较。数据量很大时,布隆过滤器表现非常优秀,而 HashSet 就很差了。 查询所需时间同数据规模和误报率设定有直接关系。hashSet 数据规模小时是王者,随着数据规模增大,变青铜,到最后麻爪,崩溃了!

上面的比较,来自于下面2段代码。 代码1: 应用 Goolge guava 的布隆过滤器代码如下:

@Test

public void guavaTest(){

long start = System.currentTimeMillis();

BloomFilter filter = BloomFilter.create(

Funnels.integerFunnel(),

capacity, // e.g. int capacity=100000

0.01

);

for(int i=0; i

filter.put(i);

}

Assert.assertTrue(filter.mightContain(1));

long end = System.currentTimeMillis();

System.out.println("执行时间:" + (end - start));

}

代码2:用 java容器 HashSet 处理此应用,代码如下:

@Test

public void hashSetTest(){

long start = System.currentTimeMillis();

Set hashset = new HashSet(capacity); // e.g. int capacity=100000

for(int i=0; i

Assert.assertTrue(hashset.contains(1));

long end = System.currentTimeMillis();

System.out.println("执行时间:" + (end - start));

}

3 话题拓展 【面试现场】如何判断一个数是否在40亿个整数中?

https://www.itcodemonkey.com/article/8258.html 这里面用的是 bitmap,即位图法。 个人感觉这种方法只适合判断整数元素是否存在。 优势是判断准确,且速度极快。 而布隆过滤器不仅适合判断整数元素,也适合判断字符串元素,例如网址。 劣势是数据量为千万级时,判断速度6秒,很慢了已经。

4 加速布隆过滤器和 bitmap

个人认为:分布式部署是布隆过滤器和bitmap加速的最无脑但很有效的方式,尤其针对布隆过滤器的加速,是个很好的选择!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值