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

    理论部分来自于一个接地气文章(除了讲了很好的故事外,还介绍了 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<Integer> filter = BloomFilter.create(
                    Funnels.integerFunnel(),
                    capacity,   // e.g. int capacity=100000
                    0.01
            );
            for(int i=0; i<capacity; 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<Integer> hashset = new HashSet(capacity);  // e.g. int capacity=100000
            for(int i=0; i<capacity; i++){hashset.add(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加速的最无脑但很有效的方式,尤其针对布隆过滤器的加速,是个很好的选择!!!

  • 相关阅读:
    C# 实现类库并调用
    C# pictureBox.Image获得图片的三种方法
    C# 指针使用总结
    C++ 怎样让函数返回数组
    C# 枚举与位枚举(Enum)
    Labview调用C#动态链接库dll
    C# partial 作用
    C# Internal关键字小结
    C# => 运算符
    C# 中 ??、 ?、 ?: 、?.、?[ ]
  • 原文地址:https://www.cnblogs.com/ZhongliangXiang/p/10071354.html
Copyright © 2011-2022 走看看