Cuckoo Filter & Bloom Filter 比较

Slides:



Advertisements
Similar presentations
數學社群 教學分享 和平國小 陳淑渟老師 數學社群 教學分享 和平國小 陳淑渟老師. 小一常發生的 學習困難 定位板的應用 序數的學習 困難與教學 突破 主題大綱.
Advertisements

健康.安全年 製作 : 黃靜怡. 安全第一,我想,這是一句大家都耳熟能詳的話吧,說安全, 簡單的說,就是注意自己、眼睛要看、耳朵要聽,不要莽莽 撞撞的,安全是大家所期望的,而父母總是常常掛念我們, 就是希望我們能安全,畢竟,孩子是父母一輩子的牽掛,會 擔心我們的,往往就是關心我們的人,每個人都希望自己做.
【大願文教基金會】園藝治療師 黃盛璘督導、王麗玲執行. 年齡在 2 足歲以上 18 歲以下,經醫學中 心或區域醫 院鑑定為 重度、極重度 身心障礙,不具行動能 力、且不能自理生活,並持有身心障礙 手冊的新北市居民。 八里愛心教養院~服務對象.
第二十九课 致儿子书 张之洞.
如何陪伴孩子度過 高三歲月.
把人的生命写在教育的旗帜上 了解一个案件 欣赏一篇散文 学习一种理念 感悟一个故事.
32个团体游戏 增加团队凝聚力.
Course 1 演算法: 效率、分析與量級 Algorithms: Efficiency, Analysis, and Order
六大原因造成 現代人身體酸性化.
【2008年高考重庆卷】A.当冰雪皑皑之际,唯独梅花昂然绽放于枝头,对生命充满希望和自信,教人精神为之一振。
景区讲解常用方法.
§2 线性空间的定义与简单性质 主要内容 引例 线性空间的定义 线性空间的简单性质 目录 下页 返回 结束.
班級愛心小護士訓練 臺南市東區勝利國小 健康中心.
資料結構 第9章 搜尋.
我在哈佛、麥肯錫 學到的一流工作術 富坂美織◎著.
项目四 营业税 山东经贸职业学院 财政金融系.
敬业·创业·乐业 ——我的成长之路 赵谦翔.
四年七班親師會 自信學習,健康成長.
醫療旅遊.
社會發展學系 簡 介.
人物小传:杨嘉嵋,1975年出生,国家 重点四川大学本科毕业,中国传媒大学博士毕业,现为上海政法学院讲师。多次发表学术论文:《试论社会主义法治的目标和现代法治精神的培育》发表于钦州师范高等专科学校校报2000年04期,《西部在引进,利用外资中应重视的问题及对策》发表于四川师范学院学报2000年05期,《试论毛泽东的刑法思想》发表于达县师范高等专科学校学报2001年01期,《美国著名主持人的十点共性》发表于中国广播电视学刊2007年08期,《我国电视法治节目的现状与提升》发表于新闻战线2008年08期。
第二章 语用的主要要素分析 第一节 语境 第二节 预设 第三节 角色 第四节 视角.
从从容容中考去.
美麗的星空 陳弦希製作.
性別刻板印象.
初三8班(上) 期末总结班会.
初三(上) 期末总结班会.
一週菜單設計.
班级安全文化建设的思考与实践 夯实安全基础 规范安全行为 培养安全习惯 训练安全能力 尤 学 文 管 理 学 博 士
改革开放给我们带来的变化 系别:11商务流通系 班级:物流四班 组员:物四男生组.
大村國小 尋根之旅.
那年我參加瑞士巴塞爾博覽會, 除了接單做貿易,還零售賣品, 以擴大出口商品的影響。
西安国际港务区 入区企业相关地方税收 知识培训
拒绝毒品健康成长 ——张鸿谊.
动商研究中心 让高校体育驶入快车道 --国家“学校体育”相关文件解读 2016 年 05 月 15 日.
資料庫設計 Database Design.
第三章 领悟人生真谛 创造人生价值 第一节 树立正确的人生观 创造有价值的人生 第二节 第三节 科学对待人生环境.
鸟的生殖和发育.
上課囉 職場甘苦談 小資男孩向錢衝 育碁數位科技 呂宗益/副理.
俄语字母的发音体系 阅读规则.
第十四章 中国特色社会主义事业的依靠力量. 第十四章 中国特色社会主义事业的依靠力量 内容提要 包括知识分子在内的工人、农民是中国特色社会主义事业的根本力量;改革开放以来出现的新的社会阶层是中国特色社会主义事业的建设者;必须认真贯彻尊重劳动、尊重知识、尊重知识人才、尊重创造的重大方针,最广泛最充分地调动一切积极因素;巩固和加强各族人民的团结合作。
閱讀與寫作 設計者:林怜秀.
终极(13)班 赵树杰 许志鹏 初二(13)班.
中国政法大学卫生法研究中心 于秀艳 2011年6月28日 杭州
思想道德修养与法律基础.
第1課 華南地區— 海陸文化的交會區.
多元文化“地球村”—— 世界文化之旅.
歡樂大派對 六年七班 第一組 自然成果發表會.
Tree(樹) 什麼是「樹」? 「樹」的範例 「樹」的定義 「樹」的表示法.
專題報告: 沒有國哪裡會有家?.
100道素菜 想看哪一道菜時 直接點一下就可進入 1西蘭花燒豆腐 2蕃茄炒凍豆腐 3東坡豆腐 4.西芹腰果百合 5土豆燉番瓜 6香椿豆腐
就在那裡上主要我去.
Chapter 4 歸納(Induction)與遞迴(Recursion)
Chap 3 堆疊與佇列 Stack and Queue.
環境教育宣導 疼愛地球 珍惜資源 愛護環境.
第五組 : 廖震昌 / 謝坤吉 / 黃麗珍 陳曉伶 / 陳思因 / 林慧佳
数据挖掘: 概念和技术 — Chapter 6 — ©张晓辉 复旦大学 (国际)数据库研究中心
数据结构 -Maple Related- 牟克典 数学科学学院信息科学系 2012秋季 1/16/2019.
Sorting 排序 Bubble Sort O(n2) Insert Sort Selection Sort Quick Sort
樹 2 Michael Tsai 2013/3/26.
校外教學六福村一日遊.
常宝宝 北京大学计算机科学与技术系 数据结构(三) 常宝宝 北京大学计算机科学与技术系
Amortized Analysis Michael Tsai 2013/11/14.
第10章 存储器接口 罗文坚 中国科大 计算机学院
Disjoint Sets Michael Tsai 2013/05/14.
演算法分析 (Analyzing Algorithms)
Efficient Query Relaxation for Complex Relationship Search on Graph Data 李舒馨
§2.2.1对数与对数运算.
Q1 以下是10個初生嬰兒,首6個月的體重改變紀錄
When using opening and closing presentation slides, use the masterbrand logo at the correct size and in the right position. This slide meets both needs.
Presentation transcript:

Cuckoo Filter & Bloom Filter 比较

过滤器应用场景举例 本地恶意URL库 Stored in Filter 这是一个好url 拦截莆田系医院网站http://www.bjfhfk.net/?yy1?yiyuan?bdjjpc13?yiyuan 远程服务器 鉴别“http://www.bjfhfk.net/?yy1?yiyuan?bdjjpc13?yiyuan ” 这是一个好url Probably Yes! Lookup(“http://www.bjfhfk.net/?yy1?yiyuan?bdjjpc13?yiyuan”) 命中!Dangerous… No! Delete(“”) 演示命中url库、以及删除单个url的过程 本地恶意URL库 Stored in Filter

过滤器的用途 Is item x in set Y 构建大型缓存 拼写检查 数据库系统 网络爬虫-URL去重复 过滤器解决的是“判别x是否在集合y中”的问题,它的使用场景可以概括为用于构建大型缓存。 无论是做拼写检查、数据库缓存还是爬虫的的url去重复,都是做这样的事情。 我们所谓的过滤器,本质上是改进的hash表,相对于最基本的散列,它做到了更高效和更低的碰撞

Bloom Filter的原理 K-散列 时空优势:布隆过滤器存储空间和插入/查询时间都是常数( O(k) O(k)) 很长时间以来,布隆过滤器是一种十分流行的过滤算法。 它的原理很简单,简而言之就是存在一个表,和K个不同的hash函数。 插入一个item的时候,会对这个item做K个hash,之后把表中对应的K个hash位全部置为true,注意,这个时候并不考虑这K个位置原来的值。 在查找一个item的时候,同样对item做K个hash,只有这K个位置全部为true,才会认为表中存在这个item。 它的优势很明显,时空优势、保密等 时空优势:布隆过滤器存储空间和插入/查询时间都是常数( O(k) O(k)) 散列函数相互之间没有关系,方便由硬件并行实现 布隆过滤器不需要存储元素本身,适合保密场合

随着存入的元素数量增加,误算率随之增加。 删除元素。 Bloom Filter的劣势 随着存入的元素数量增加,误算率随之增加。 删除元素。 当然它的问题也很明显,一个是误算率,另一个就是不能删除。删除一个item绝对不可以把K个位置全部置为false,因为这会使命中这七个位置任何一个的item全部会识别为不存在。实际上改进布隆过滤器使之可以删除是很麻烦的。最常见的思路是每个位置都存一个uint,插入时增1,删除时减1,不过这也有问题,因为并不确定要删的元素就一定已经存在于表中。有一种叫做d-left bloom的改进过滤器似乎解决了这个问题,但是它又过于笨拙。 误算率更易理解,随着数据的增多,空位越少,就越容易把一个不存在于表中的数据判定为存在。在表满的时候,更是会把所有的数据均判定为存在于表中。 正式因为它的这些风险,我们才会选择使用cuckoo

误算率稳定,整体远低于Bloom Filter 使用Cuckoo Filter的原因 删除方便 误算率稳定,整体远低于Bloom Filter Cuckoo的核心优势就是两个,删除方便,甚至比插入还要方便;误算率稳定而且远低于布隆,当然,任何hash避免碰撞都是理论上不可能的,不过优化的cuckoo filter在3%的错误率的情况下,使用的空间似乎远小于bloom filter

Cuckoo Filter方法: 选位: bucket1 = hash1(x) bucket2 = bucket1⊕hash1 (FP(x)) 占位【杜鹃】: alternate(x) = current(x) ⊕ hash(FP(x)) ……(有限递归) Cuckoo的意思是杜鹃,它的来源就是杜鹃下蛋的原理。杜鹃下蛋的故事十万个为什么里面讲过的,就是它把蛋下在人家的窝里,把人家的蛋搞掉。Cuckoo filter也类似,每个item选两个位置,判断这两个位置是否为空,如果有一个为空,就放在这个位置上,如果都不为空,就选一个位置,取出这上面的item,放自己,然后在把这个取出的item放到那个item自己的另一个位置上,当然那个位置也会可能不为空,那个时候再把对应位置上的item取出做这种操作。

注意 指纹:log b/n 链表习惯挂桶,提升过滤器效率(不挂桶的效率最大只有50%,论文上介绍挂桶效率可达到95%,取决于数据结构设计) 链表挂桶,桶本身可以做简单排序,能提升命中效率 桶的长度不宜过大,那样把过多处理放在了桶的遍历上 当然,一般编程的时会对这种操作做一个限制,不会无限制的允许这种递归。另外,就好像第三个图这样,大部分时候也会对hash表进行挂桶操作,这样结合有限递归的限制,会降低出错率。 不过挂桶不宜过多,否则hash表本身的性能就降低了。 在改进版的cuckoo filter中对桶会做semi-sorting,能够降低空间消耗,这个后面会说一下。 刚刚说cuckoo filter存储item,在每个位置上,都会存储一个指纹,根据论文中的数据,指纹长度最合适为log b/n 以上,b为hash表长度,n为挂桶数量。关于这个地方后面我补充了详细的测试数据。

算法 Algorithm 2: Lookup(x) f = fingerprint(x); i 1 = hash(x); Algorithm 1: Insert(x) f = fingerprint(x); i 1 = hash(x); i 2 = i 1 ⊕ hash(f); if bucket[i 1 ] or bucket[i 2 ] has an empty entry then add f to that bucket; return Done; // must relocate existing items; i = randomly pick i 1 or i 2 ; for n = 0; n < MaxNumKicks; n++ do randomly select an entry e from bucket[i]; swap f and the fingerprint stored in entry e; i = i ⊕ hash(f); if bucket[i] has an empty entry then add f to bucket[i]; // Hashtable is considered full; return Failure; Algorithm 2: Lookup(x) f = fingerprint(x); i 1 = hash(x); i 2 = i 1 ⊕ hash(f); if bucket[i 1 ] or bucket[i 2 ] has f then return True; return False; Algorithm 3: Delete(x) remove a copy of f from this bucket; 这是cuckoo的增删查的算法。 增加算法的核心也就是这几个hash函数的运用。一个用于选位,另一个用于生成指纹,实际上这也是hash本身的用途,就是选位和指纹加密。可以看到,我标红的地方,信息指纹hash非常重要,这个hash函数一会可以看一眼代码,我用的那个方案类似于rabin的原理。Rabin指纹是密码学里面特别常用的加密。它也叫随机多项式算法,特点是计算效率高,随机性好,换句话说就是重复率低,很多模式识别也会用。Max这个参数是指有限递归的容忍度,就是递归选位最多选多少次。 Lookup是查找的算法,相对简单,就是看一下item对应的两个位置上有没有对应的指纹就可以,lookup的准确度依赖于指纹的可信赖性。 删除操作本质上就是查找,查出指纹删了就可以。

操作对比 Insert O ( 1 ) Delete O(1) Lookup O ( 1 ) Capacity x bucket x fingersize & maxRetries K & Capacity 我们可以尝试对比下,实际上效率没有数量级的差别,都是O(1)。 对于这样两个大小的表,相对于复杂度的算计,访问位置数量区间更加直观。可以看出,对于插入和查找操作,布隆都是访问K个位置,儿对于插入,cuckoo一般在2bucket个位置访问即可,最差情况要访问2+maxRetries x bucket个位置。 对于删除和查找,只需要在2xbucket个位置中查找即可。 bloom cuckoo 综合 Insert K (2-[2+maxRetries]) x bucket O(1) Delete cannot 2 x bucket Lookup

Cuckoo Filter code func rabinFingerprintFunc(value []byte, fingerprintSize uint) Fingerprint { windowsize := 8 mod := 255 prime := 71 pow := int(math.Pow(float64(prime), float64(windowsize))) % mod prntfngr:= make([]byte, fingerprintSize) for j, _ := range prntfngr { rollhash := 149 // 1001 0101 outbyte := 0 for i, v := range value { // rollhash = (rollhash * PRIME + inbyte - outbyte * POW) % MODULUS // Include j so that each iteration is different rollhash = (rollhash*prime + int(v) + j*prime - outbyte*pow) % mod if i > windowsize { outbyte = int(v) } prntfngr[j] = byte(rollhash) return prntfngr 然后,看一眼刚刚介绍的rabin指纹,它的特点是有个窗口,做滚动hash,对每一位都做散列操作,保证了随机性的优秀。

实际测试数据 表结构:10000x4x8*8 单次插入允许碰撞:10 填充数据:1000-40000[2000] 测试数据:0-50000 插入错误,插入成功,碰撞, 正确, 错误 0, 1000, 0, 1000, 0 0, 3000, 0, 3000, 7 0, 5000, 0, 5000, 10 0, 7000, 0, 7000, 11 0, 9000, 0, 9000, 6 0, 11000, 0, 11000, 15 0, 13000, 0, 13000, 44 0, 15000, 0, 15000, 81 0, 17000, 0, 17000, 119 0, 19000, 0, 19000, 153 0, 21000, 2, 20998, 185 0, 23000, 18, 22982, 198 0, 25000, 26, 24974, 215 0, 27000, 49, 26952, 217 0, 29000, 92, 28908, 237 0, 31000, 359, 30645, 241 0, 33000, 1009, 32022, 222 3, 34997, 2585, 32554, 227 32, 36968, 5224, 32259, 233 468, 39532, 15848, 27252, 240 表结构:10000x4x8*8 单次插入允许碰撞:10 填充数据:1000-40000[2000] 测试数据:0-50000 1.2% | | 2.4% 87.5% 注意观察特殊颜色的数据,可以发现这种条件下的插入失败为1.2%,错误识别为1.2% 插入失败的频率可以用碰撞约束才调整。可以看出,即使在当前的条件下,数据接近90%的时候,过滤器的性能还是很优秀的,这也符合论文中所描述的。 错误识别,分为把正确的认为错的,也可以是把错的当成对的,不过从危害性上,后者危害可能更大,前者只是会降低部分性能。 对于错误识别率,很容易发现这几乎是超长的指纹所致,超长的指纹让本已经接近充满的表都并不会错认数据。

指纹长度为log n/b时错误率最低 表结构:4096x2x[1-10] 单次插入允许碰撞:2 填充数据:8000 测试数据:0-40000 插入错误,插入成功,碰撞, 正确, 错误 780, 7220, 8248, 3521, 313 579, 7421, 6299, 4457, 11 626, 7374, 6535, 4333, 14 560, 7440, 6195, 4564, 24 531, 7469, 5936, 4689, 17 568, 7432, 6303, 4491, 8 577, 7423, 6285, 4525, 11 556, 7444, 6087, 4587, 12 539, 7461, 6021, 4656, 11 552, 7448, 6148, 4563, 17 表结构:4096x2x[1-10] 单次插入允许碰撞:2 填充数据:8000 测试数据:0-40000 关于log n/b这个公式,我进行了较为详细的测试。可以看这个表,这个表只有错误识别列是值得关注的,正确率同样很低,但是并不值得过分关注,识别正确率低的原因在于允许碰撞次数太少,很多填充准确的值被布谷鸟最终踢掉了,这又不在插入错误的统计。 按照这张表,最合适的指纹长度为log4096/2,大概是10-11之间,可以看到除了第一组的错误率超高之外,下面的全都降低了数量级。 大概是一个byte是八位,2个byte就远大于11了。所以后面指纹增长的效果接近于没有。 最开始踩了一个坑,就是错误的把bit当做byte计算,犯了常识性错误。

上面那组数据我自己看着都不信啊 插入错误,插入成功,碰撞 1726320, 8273680, 0 1081929, 8918071, 0 1726320, 8273680, 0 1081929, 8918071, 0 1049358, 8950642, 0 1045286, 8954714, 0 1058844, 8941156, 0 1046334, 8953666, 0 表结构:4096*4096x1x[1-6] 单次插入允许碰撞:0 填充数据:10000000 当然,上面那组数据太不明显,又因为我的程序里面指纹长度都是byte约束而很难做bit长度的约束,所以我只能扩大数据量和表长 对于这样一个表,我做了一个单元测试。并且强制约束禁止碰撞,并不挂桶,这样也许结果更明显。 这个时候理论上最佳的指纹长度应该是log4096*4096,也就是24位,折算成byte,应该在三位以上 这时我们对比插入成功和插入失败,也是大概在这个地方,性能停滞了,所以基本符合理论。

指纹长度-成功率趋势图 in theory n: hash table size, b: bucket size see more analysis in paper 看到网上有这样一张图,它的数据5bit为是奇点。

存储

Lookup-MOPS 这是几种过滤器的性能对比,MOPS:MIllion Operation Per Second 中文全称:每秒百万次运算。 所以这个数据肯定是越大越好了。 所以看出cuckoo的性能应该是最佳。 Semi sort是改造的cuckoo filter,会对桶内数据排序,目的是压缩节约空间,所以性能会降低很多,我也没觉得这样压缩有什么特别大的意义,8亿数据才节约1G内存。 Blocked bloom不命中的效率高是因为它本身相当于中间又加了一层缓存,或者说索引。 包括其他几种bloom的变种,从本身算法看,都有点画蛇添足,反而举例bloom的轻量越来越远。

布隆过滤器&&酷壳过滤器 时空优势 保密性 散列函数 删除元素 误算率

不同过滤器比较[未测试] Bloom blocked Bloom counting Bloom d-left counting Bloom quotient cuckoo

Over zhangpenghao@360.cn 2016.8.4