游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

BitmapRoaringBitmap原理分析

  作者:京东科技曹留界
  在人群本地化实践中我们介绍了人群ID中所有的pin的偏移量可以通过Bitmap存储,而Bitmap所占用的空间大小只与偏移量的最大值有关系。假如现在要向Bitmap内存入两个pin对应的偏移量,一个偏移量为1,另一个偏移量为100w,那么Bitmap存储直接需要100wbit的空间吗?数据部将偏移量存入Bitmap时,又如何解决数据稀疏问题呢?本文将为大家解答这个问题。一、BitMap
  Bitmap的基本思想就是用一个bit位来标记某个元素对应的Value,而Key即是该元素。由于采用了Bit为单位来存储数据,因此可以大大节省存储空间。
  如果想将数字2存入位图中,则只需要将位图数组中下标为2的数组值置为1。
  但是,如果现在要存储两个人群ID对应的偏移量,一个偏移量为1,另一个偏移量为100w,如果将这两个值直接放到位图数组中,那么位图数组所需要的空间就是100wbit,会产生大量的空间浪费。那么有什么方法可以避免空间浪费吗?答案就是RoaringBitMap!二、RoaringBitMap
  RoaringBitMap是一种高效压缩位图,简称RBM。RBM的概念于2016年由S。Chambi、D。Lemire、O。Kaser等人在论文《BetterbitmapperformancewithRoaringbitmaps》《ConsistentlyfasterandsmallercompressedbitmapswithRoaring》中提出。下面我们结合java中的实现对其进行介绍。2。1实现思路
  RBM主要将32位的整型(int)分为高16位和低16位(两个short),其中高16位对应的数字使用16位整型有序数组存储,低16位根据不同的情况选择三种不同的container来存储,这三种container分别为:
  ArrayContainer
  底层数据结构为short类型的数组,直接将数字低16位的值存储到该数组中。short类型的数组始终保持有序,方便使用二分查找,且不会存储重复数值。因为这种Container存储数据没有任何压缩,因此只适合存储少量数据。其内部数组容量是动态变化的,当容量不够时会进行扩容,最大容量为4096。由于数组是有序的,存储和查询时都可以通过二分查找快速定位其在数组中的位置。
  ArrayContainer占用的空间大小与存储的数据量为线性关系,每个short为2字节,因此存储了N个数据的ArrayContainer占用空间大致为2N字节。存储一个数据占用2字节,存储4096个数据占用8kb。
  BitmapContainer
  底层实现为位图。这种Container使用long〔〕存储位图数据。我们知道,每个Container处理16位整形的数据,也就是065535,因此根据位图的原理,需要65536个比特来存储数据,每个比特位用1来表示有,0来表示无。每个long有64位,因此需要1024个long来提供65536个比特。
  因此,每个BitmapContainer在构建时就会初始化长度为1024的long〔〕。这就意味着,不管一个BitmapContainer中只存储了1个数据还是存储了65536个数据,占用的空间都是同样的8kb。
  RunContainer
  RunContainer中的Run指的是行程长度压缩算法(RunLengthEncoding),对连续数据有比较好的压缩效果。
  它的原理是,对于连续出现的数字,只记录初始数字和后续数量。即:
  对于数列11,它会压缩为11,0;
  对于数列11,12,13,14,15,它会压缩为11,4;
  对于数列11,12,13,14,15,21,22,它会压缩为11,4,21,1;
  源码中的short〔〕valueslength中存储的就是压缩后的数据。
  这种压缩算法的性能和数据的连续性(紧凑性)关系极为密切,对于连续的100个short,它能从200字节压缩为4字节,但对于完全不连续的100个short,编码完之后反而会从200字节变为400字节。
  如果要分析RunContainer的容量,我们可以做下面两种极端的假设:
  最好情况,即只存在一个数据或只存在一串连续数字,那么只会存储2个short,占用4字节
  最坏情况,065535的范围内填充所有的奇数位(或所有偶数位),需要存储65536个short,128kb
  也就RBM在存入一个32位的整形数字时,会先按照该数字的高16位进行分桶,以确定该数字要存入到哪个桶中。确定好分桶位置后,再将该数字对应的低16位放入到当前桶所对应的container中。
  举个栗子
  以十进制数字131122为例,现在我们要将该数字放入到RBM中。第一步,先将该数字转换为16进制,131122对应的十六进制为0x00020032;其中,高十六位对应0x0002,首先我们找到0x0002所在的桶,再将131122的低16位存入到对应的container中,131122的低16位转换为10进制就是50,没有超过ArrayContainer的容量4096,所以将低16位直接放入到对应的ArrayContainer中。
  如果要插入的数字低16位超过了4096,RBM会将ArrayContainer转换为BitMapContainer。反之,如果数据在删除之后,数组中的最大数据小于4096,RBM会将BitMapContainer转换回ArrayContainer。
  RBM处理的是32位的数字,如果我们想处理Long类型的数字怎么办呢?这个时候可以使用Roaring64NavigableMap。Roaring64NavigableMap也是使用拆分模式,将一个long类型数据,拆分为高32位与低32位,高32位代表索引,低32位存储到对应RoaringBitmap中,其内部是一个TreeMap类型的结构,会按照signed或者unsigned进行排序,key代表高32位,value代表对应的RoaringBitmap。三、空间占用对比
  1、连续数据
  分别向位图中插入1w、10w、100w、1000w条连续数据,并且对比BitMap和RoaringBitMap占用空间的大小。比较结果如下表所示:
  10w数据占用空间
  100w数据占用空间
  1000w数据占用空间
  BitMap
  97。7KB
  976。6KB
  9。5MB
  RoaringBitMap
  16KB
  128KB
  1。2MBTestpublicvoidtestSizeOfBitMap(){对比占用空间大小10w元素RoaringBitmaproaringBitmap3newRoaringBitmap();byte〔〕bits2newbyte〔100000〕;for(inti0;i100000;i){roaringBitmap3。add(i);bits2〔i〕(byte)i;}System。out。println(10w数据roaringbitmapbytesize:roaringBitmap3。getSizeInBytes());System。out。println(10w数据位图数组bytesize:bits2。length);RoaringBitmaproaringBitmap4newRoaringBitmap();byte〔〕bits3newbyte〔1000000〕;for(inti0;i1000000;i){roaringBitmap4。add(i);bits3〔i〕(byte)i;}System。out。println(100w数据roaringbitmapbytesize:roaringBitmap4。getSizeInBytes());System。out。println(100w数据位图数组bytesize:bits3。length);RoaringBitmaproaringBitmap5newRoaringBitmap();byte〔〕bits4newbyte〔10000000〕;for(inti0;i10000000;i){roaringBitmap5。add(i);bits4〔i〕(byte)i;}System。out。println(1000w数据roaringbitmapbytesize:roaringBitmap5。getSizeInBytes());System。out。println(1000w数据位图数组bytesize:bits4。length);}
  运行截图:
  2、稀疏数据
  我们知道,位图所占用空间大小只和位图中索引的最大值有关系,现在我们向位图中插入1和999w两个偏移量位的元素,再次对比BitMap和RoaringBitMap所占用空间大小。
  占用空间
  BitMap
  9。5MB
  RoaringBitMap
  24ByteTestpublicvoidtestSize(){RoaringBitmaproaringBitmap5newRoaringBitmap();byte〔〕bits4newbyte〔10000000〕;for(inti0;i10000000;i){if(i1i9999999){roaringBitmap5。add(i);bits4〔i〕(byte)i;}}System。out。println(两个稀疏数据roaringbitmapbytesize:roaringBitmap5。getSizeInBytes());System。out。println(两个稀疏数据位图数组bytesize:bits4。length);}
  运行截图:

免票免票免票北京孩子迎来随便逛时代程旭今年12岁,刚刚升入中学,从小喜欢打篮球的他,个子一直是班里最高的。小时候爸妈带我去公园,门口检查的人总招手让我过去测身高,说超过一米二要买票,其实那时候我才念小学。他无奈……卡哥游戏攻略新手玩吕布常犯3个误区,而学会附魔是基本功文卡哥游戏攻略大家好,我是卡哥,很高兴能够跟各位讲讲吕布的心得体会。吕布是一名具有很强分割战场能力的战士,如果不能把这个点理解透彻,那么在打团战的时候,吕布就会畏首……我眼神儿贼好!初入校园攻略这次带来的是手游《我眼神儿贼好!》剧情模式隐形守护者第2关,初入校园攻略。本关一共需要找到6个物品。点击小路右边的两个音箱。音箱打开后突然蹦出个女孩在下路中间……谢霆锋获最佳男主角奖,穿西装走红毯不简单,一手提着外套挺慵懒简约的西装风格采用了最高级的情怀,通过西装的魅力值提升搭配的美感,在服装的风格当中,西装的另一个搭档就是衬衫,比西装更加迷人,而且可以单独搭配,也可以整体搭配,为服装增添魅力值……华为Mate50Pro概念机极致轻薄刀锋机身,可惜不支持5G不得不说,除了苹果之外,华为的机型应该是国内目前表现最好的高端旗舰机,虽然目前大部分在售的华为手机都不支持5G网络,但确实在高端市场,也只有华为能够对苹果造成压力。其实不……迪拜为分时度假运营商推出了一站式服务网站周六,迪拜推出了一个在线网站,供分时度假运营商注册和申请许可证,这也将鼓励游客逗留更长时间并吸引对该行业的投资。该网站允许潜在的分时度假运营商注册和提交分时度假物业申请,……回头率拉满!这耳机妥妥的运动好伙伴虽说好的运动耳机并不能直接让你拥有健康,但是体验感极差的运动蓝牙耳机肯定会给你带来深刻的伤害。为了能够拥有不错的运动状态,选购一款好的蓝牙耳机产品无疑是很有必要的,而韶音Aer……12绝杀!中国女足王牌闪耀欧洲,冲刺8。64米秒,获亚洲MV前言为了备战接下来的印度女足亚洲杯,12月8日,中国女足公布了新一期由34人组成的集训大名单,此前落选东京奥运会的王牌射手唐佳丽出现在该名单中。正文从10险胜……几个月大婴儿会假哭?宝宝聪明的表现,了解背后原因你会更心疼娃导语:哭,是人类最原始的表达,笑是我们的常态。新生婴儿以啼哭宣告降临这个世界,但这一声啼哭并不带任何情绪,它只是宝宝的深呼吸,标志着肺部张开,真正开启了自己的人生征程。哭……韦伯太空望远镜顺利发射入轨将有助于解答宇宙从何而来的问题12月25日,美国宇航局的詹姆斯韦伯太空望远镜,在圭亚那库鲁基地成功发射升空。目前火箭已经进入最终轨道。如果一切顺利,将在一个月之内进入太阳轨道。不得不说,这是人类发展史上的一……大量出手换来极其低效的进攻,库里12月状态到底发生了什么虽然刚刚加冕历史三分王,但进入12月库里的手感似乎有些冰冷,总共出手184,仅命中65球,命中率35,其中三分出手129,仅命中45个,命中率不足35,以至于直接将库里赛季整体……隐姓埋名四十年的孤胆英雄,是怎样神一般的存在曾经两次闯进敌军指挥所,生擒敌军中将,凭借一根爆破筒俘虏整个敌军指挥所人员,你一定不会想到那时候的张国富才不满19周岁。1950年的时候,从全军遴选的300多名战斗英雄参……
这夜创造了世界杯历史的,是一个女人上周五的世界杯上,德国4:2战胜了哥斯达黎加,却依然无缘小组出线。扼腕叹息时,我同样注意到,赛场上有一名女性正在悄悄地创造着历史主裁判斯蒂芬妮弗拉帕尔(StphanieFrap……漫游西南200天(day54)2021年11月24日大理古城晴又见大理古城一个家家有水户户有花的地方第N次来到大理古城,却是第一次走进大理市博物馆,始建于清康熙年间,原为云南提督府衙……正负值20!哈里斯2555,76人30送魔术4连败北京时间2022年11月28日讯,魔术以103:133,30分分差不敌对手76人。哈里斯本场比赛首发出战29分钟,投篮14投10中,命中率为71。43,三分球2中2,三分……财经早餐本周聚焦美联储经济褐皮书,鲍威尔讲话中寻找更多政策路北京时间周一(11月28日),本周将迎来美联储公布经济褐皮书,以及美联储主席鲍威尔就美国经济前景和就业市场发表讲话,且多位美联储官员讲话,将从中寻找更多美联储加息规模的信息,关……研究揭示油菜素内酯调控植物对热胁迫响应的分子机制全球气候变暖导致生长季节高温天气频发,造成作物减产、品质下降,在农业生产和生态学研究中受到广泛关注。因此,研究增强植物对热胁迫耐性的分子机制具有重要的理论意义和实际应用价值。油……中国最危险的七个古村落,一边是极致的危险,一边是无限的诱惑以后损人可别再说你们村是不是没通网了,有可能真是通不了。中国最危险的七个古村落,建于悬崖之上,风景却美到窒息,震撼人心,却鲜有人知。第一、湖南芙蓉镇。位于湖南……清热去火理气通腑下廉穴【经穴含义】下廉穴,出自《针灸甲乙经》,属手阳明大肠经,国际标号:LI8。下,下方的意思;廉,指的是边侧、边缘,又指形状像棱角。握拳屈肘时,本穴在前臂的背面,靠近桡……父母到底应该怎样爱孩子今早看到一篇文章,里面有这么一段话有话说不养儿不知父母恩,为什么我养了孩子后才发现父母并没那么爱我。一看之下,很觉惊讶,觉得不过是个别人的个别论点,再翻看评论区,发现居然好多人……羽绒服如何穿得时髦?主要从内搭和下装判断,差别很明显羽绒服曾经被大家嫌弃,很多人都觉得羽绒服时尚感差,穿在身上显胖臃肿,完全没优点,但其实在这个冬天我们的衣橱中还是少不了羽绒服,羽绒服的设计越来越多,大家只要认真的挑选,可以寻找……人到中年,自我滋养的8种方式曾看到这样一句话。人有两次诞生,第一次是从母亲的腹中来到世间;第二次就是能够在命运的各种变化起伏中学会做自己的母亲,关爱自己。特别是人到中年,经历了半生的损耗……头条有我,我为头条,我的生活也是头条我的生活也是头条2022年,我善待生活,生活也没亏欠我。我很简单,却一直干着复杂的事,疲倦但很快乐,这就是我的生活,件件都是头条,条条都值得记忆。2022年,我是一……大冷门!黑马23分掀翻浙江,MVP拉胯无力救主,王世龙场边摇问:如何每天都能收到如此有趣的体育原创资讯?答:只需轻点右上角的关注按钮就能实现梦想。竞技体育不能只看纸面实力,如果你不能稳定地打出自己的特点,即使面对鱼腩球队也会……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网