专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

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);}
  运行截图:

孩子,巴掌打在你身,也痛在我心自从疫情开始以来,家庭教育就成为了重中之重,孩子与父母因为各种因素如吃饭学习睡觉玩手机等引发的问题接连不断发生,甚至大打出手,之后又后悔不已!王妈妈说不该打孩子的,当时太生气了,过微视界红毯pk赵丽颖圆润,金晨挑战芭比粉,关晓彤争气了11月29日,微视界红毯举行,女明星们争奇斗艳,靓丽的造型又创造了不少话题,看看你最喜欢哪一套?赵丽颖身穿黄色无袖水钻长裙,搭配长发波浪卷,似乎在还原风吹半夏中的造型,脸部圆润,皮璐比玛斯NOBEEMAS你的形象就是你品味的体现女人如何让自己成为一朵久散幽香的不老之花,唯一办法,便是让自己变得越来越有品味,越来越有内涵,成为一个优雅的女人。一个有品味有内涵的女人,如同深邃的古井之水,一眼望不到底,清澈甜美NomosLudwigNeomatik41mm日历腕表不实用但很酷就在柏林墙倒塌的几个月后,RolandSchwertner创立了Nomos这个品牌,并在格拉苏蒂建立起了自己的工坊,与一些备受尊敬的德国制表品牌成为了邻居。凭借着自家位于柏林的设计答应我穿羽绒服时尽量少配这2条裤子,多穿另外3种,时髦显瘦冬日能带来温暖和治愈感的外套,还是要羽绒服才能给我们,但是羽绒服只是随便穿穿而已吗?搭配它的裤子也是随便抓起一条就行?错!如果想把你的羽绒服穿好穿时髦,还是得学会避雷和选择正确的裤43岁法令纹深,挑战大拉皮鼻基底填充,27天了公开一些真实感受以下为求美者自述爱美之心人皆有之,在保证自己安全的前提下,应该很少有人能拒绝让自己变美变年轻的方式,我也不例外。年轻的时候,我的皮肤属于又白又嫩的类型,经常被人夸皮肤好。可是近两年激励自己的十大狠话1只要站起来的次数比倒下去的次数多,那就是成功。2做真实的自己,不要为了取悦别人或试图成为某个人。做你最原始的自己,比做任何人的复制品都来得好。3如果你能力一般,不擅长解决各种事宜让自己越来越有价值的6个好习惯,赶紧行动起来吧你应该听说过这句话吧?是金子,就会发光,可是,你觉得你是金子么?如果,你拥有身为金子般的自信,那么现在的你,无论是收入还是身价,都已经超出正常人水平好几倍了,如果你没有这种自信,那被搁浅的梦有的人,一生只确定一个梦想,他们就会目标明确地盯着属于他们自己的方向,就像猎豹在密丛中潜藏蛰伏,伺机而动,实现它的目的。有的人,人生的每个阶段的梦想会随着不确定的人或物而不断的更改乌鸦与孔雀20051123动物园孔雀馆里有一棵梧桐树,整个树冠有幸钻出了铁罩子。茂密的树枝上站着一只乌鸦,它得意地看着罩子里的孔雀,忍不住嘎嘎地叫起来。孔雀一惊,抬头望一眼乌鸦,觉得莫名其妙少女的冲动头条作者云开日初少女的美艳,无与伦比是花开富贵的花朵是含苞待放的花蕊是楚楚动人的模样是花开生动的妩媚眼眸里是清澈见底的月亮腰肢是柔软的,杨柳细细婀娜多姿的身影,神韵清纯靓丽的色彩,
俄传噩耗,苏25克里米亚起飞未离开机场就坠毁,飞行员没能弹射苏25攻击机是目前俄罗斯在乌克兰战场上使用最为频繁的一款攻击机,当然乌克兰局奴迪也正在使用同样的苏25攻击机发起对于俄军的打击行动,苏25作为一款诞生于苏联时代的战机,其综合性能已英女王没白疼小儿媳!苏菲王妃为女王守灵太悲痛,卡米拉很气派啊英国王室的苏菲王妃是女王最疼爱的儿媳妇,大家都知道安妮公主是女王唯一的女儿,而女王却把儿媳妇苏菲王妃当做是自己的第二个女儿,女王觉得这个小儿媳非常可靠。女王的三个儿子中,也就是小儿今年上半年起诉各类证券犯罪147人,同比上升93。4南都湾财社讯记者王玉凤9月9日,最高检联合最高法公安部中国证监会召开的依法从严打击证券违法犯罪为资本市场营造良好法治环境公布了5个典型案例,涉及涉及违规披露不披露重要信息罪操纵证券申购人数已超11。3万人宏光MINIEV敞篷版将于9月21日上市日前,我们从上汽通用五菱官方获悉,五菱宏光MINIEV敞篷版将于9月21日上市,同时五菱宏光MINIEVGAMEBOY将推出新颜色。新车已经于9月1日开启了抽签购,并将于9月21日英国女王葬礼细节公布,有人抱怨女王葬礼细节公布,有人抱怨11,GuardianPolitico,,枕边人如此恶毒,逼得孕妇如斯凶猛怀孕六个月的时候,我无意中在网上看到了我老公发的帖子。他问网友有没有能让大月龄孕妇自然流产的办法?我万万没有想到,体贴细心的二十四孝好老公,竟然是一头披着羊皮的狼。1hr孕六月的时这3种人备孕没那么简单,要当心随着年龄的增长,越来越多90后95后加入了备孕的大军。此外,三胎政策全面开放后,不少大龄夫妻也开始蠢蠢欲动。备孕需要讲究天时地利人和,同房时间女性生理周期夫妻双方身体素质精子卵子质未来,哪些工作岗位会是铁饭碗智能化广受追捧可持续性行业高歌猛进未来,哪些工作岗位会是铁饭碗图片来源LNS研究网站科技创新世界潮记者刘霞当下,以智能化为核心的人类第四次工业革命正以前所未有的态势席卷而来,改变着51个娃设53个班干部岗位班主任用心良苦家长纷纷点赞四川有家长分享这么个有趣的事情自家孩子读小学,孩子的班主任老师设置了53个班干部岗位,而全班一共都只有51名同学,也就是所有孩子都是班干部。除了我们常见的班长学习委员外,还有雨伞管什么样的王者ID比较搞笑又不失文雅?看到玩家的答案,我笑了Hello,大家好,这里是头号游戏,每天都会带来最新的游戏资讯!在王者荣耀里面,每一个玩家都会有一个属于自己的游戏名字,这也是大家进入游戏后做的第1件事情,游戏名字可以代表玩家的态CheatEngine游戏修改器中文版,在游戏改钱改等级破关更容易头条创作挑战赛长大后生活被各种琐碎的事情填满,连要打游戏都变得很奢侈,如果还想感受玩游戏努力破关的感动,使用最少时间来进行游戏应该是一种方法!我有一个很喜欢打游戏的好朋友,长大后他
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网