最新要闻
- 大V实测百度AI画图:输入“刘慈欣” 打死也想不出画的是啥
- 每日时讯!海底捞回应孕妇可以插队:目前仅黑海会员有排队优先权益
- 当前滚动:中国移动:2023年营收将突破1万亿 利润或有史以来最高
- 全球实时:德媒:纳格尔斯曼昨天还在与女友一起度假,今天就面临下课
- ChatGPT又一个重磅功能插件系统上线 胡说八道的毛病治好了
- 焦点短讯!电影《铃芽之旅》预售票房破亿:3月24日上映
- 不速之约电视剧剧情
- 前沿资讯!美国智库:25%美成年人吃不饱饭 很多人应急储蓄不足500美元
- 理想MPV预告图泄露 李想微博回应 还有5款纯电车型
- 微星发布第二款不用风扇的PCIe 5.0 SSD:又是尴尬的残血
- 贾跃亭真成了 法拉第未来宣布:FF 91将于3月30日开始生产
- 《CS》终于迎来一波超级大更新:有倒爷一晚上赚了几十万!
- 【天天聚看点】又吵上了热搜:网友称海底捞水果仅限打包一份
- 今年又有多少让人扶额的青团?
- 世界最资讯丨商务部:美方应尽早取消对华加征的301关税
- 《暗黑破坏神4》B测神优化!N多RTX 3080 Ti惨遭黑屏变砖 暴雪:概不负责
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
Bitmap、RoaringBitmap原理分析
作者:京东科技曹留界
在人群本地化实践中我们介绍了人群ID中所有的pin的偏移量可以通过Bitmap存储,而Bitmap所占用的空间大小只与偏移量的最大值有关系。假如现在要向Bitmap内存入两个pin对应的偏移量,一个偏移量为1,另一个偏移量为100w,那么Bitmap存储直接需要100w bit的空间吗?数据部将偏移量存入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等人在论文《Better bitmap performance with Roaring bitmaps》 《Consistently faster and smaller compressed bitmaps with Roaring》中提出。下面我们结合java中的实现对其进行介绍。
2.1 实现思路
RBM主要将32位的整型(int)分为高16位和低16位(两个short),其中高16位对应的数字使用16位整型有序数组存储,低16位根据不同的情况选择三种不同的container来存储,这三种container分别为:
•Array Container
底层数据结构为short类型的数组,直接将数字低16位的值存储到该数组中。short类型的数组始终保持有序,方便使用二分查找,且不会存储重复数值。因为这种Container存储数据没有任何压缩,因此只适合存储少量数据。其内部数组容量是动态变化的,当容量不够时会进行扩容,最大容量为4096。由于数组是有序的,存储和查询时都可以通过二分查找快速定位其在数组中的位置。
ArrayContainer占用的空间大小与存储的数据量为线性关系,每个short为2字节,因此存储了N个数据的ArrayContainer占用空间大致为2N字节。存储一个数据占用2字节,存储4096个数据占用8kb。
•Bitmap Container
底层实现为位图。这种Container使用long[]存储位图数据。我们知道,每个Container处理16位整形的数据,也就是0~65535,因此根据位图的原理,需要65536个比特来存储数据,每个比特位用1来表示有,0来表示无。每个long有64位,因此需要1024个long来提供65536个比特。
因此,每个BitmapContainer在构建时就会初始化长度为1024的long[]。这就意味着,不管一个BitmapContainer中只存储了1个数据还是存储了65536个数据,占用的空间都是同样的8kb。
•Run Container
RunContainer中的Run指的是行程长度压缩算法(Run Length Encoding),对连续数据有比较好的压缩效果。
它的原理是,对于连续出现的数字,只记录初始数字和后续数量。即:
•对于数列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字节
最坏情况,0~65535的范围内填充所有的奇数位(或所有偶数位),需要存储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.2MB |
@Test public void testSizeOfBitMap() { //对比占用空间大小 - 10w元素 RoaringBitmap roaringBitmap3 = new RoaringBitmap(); byte[] bits2 = new byte[100000]; for (int i = 0; i < 100000; i++) { roaringBitmap3.add(i); bits2[i] = (byte) i; } System.out.println("10w数据 roaringbitmap byte size:"+ roaringBitmap3.getSizeInBytes()); System.out.println("10w数据 位图数组 byte size:"+bits2.length); RoaringBitmap roaringBitmap4 = new RoaringBitmap(); byte[] bits3 = new byte[1000000]; for (int i = 0; i < 1000000; i++) { roaringBitmap4.add(i); bits3[i] = (byte) i; } System.out.println("100w数据 roaringbitmap byte size:"+ roaringBitmap4.getSizeInBytes()); System.out.println("100w数据 位图数组 byte size:"+bits3.length); RoaringBitmap roaringBitmap5 = new RoaringBitmap(); byte[] bits4 = new byte[10000000]; for (int i = 0; i < 10000000; i++) { roaringBitmap5.add(i); bits4[i] = (byte) i; } System.out.println("1000w数据 roaringbitmap byte size:"+ roaringBitmap5.getSizeInBytes()); System.out.println("1000w数据 位图数组 byte size:"+bits4.length); }
运行截图:
2、稀疏数据
我们知道,位图所占用空间大小只和位图中索引的最大值有关系,现在我们向位图中插入1和999w两个偏移量位的元素,再次对比BitMap和RoaringBitMap所占用空间大小。
占用空间 | |
---|---|
BitMap | 9.5MB |
RoaringBitMap | 24Byte |
@Test public void testSize() { RoaringBitmap roaringBitmap5 = new RoaringBitmap(); byte[] bits4 = new byte[10000000]; for (int i = 0; i < 10000000; i++) { if (i == 1 || i == 9999999) { roaringBitmap5.add(i); bits4[i] = (byte) i; } } System.out.println("两个稀疏数据 roaringbitmap byte size:"+ roaringBitmap5.getSizeInBytes()); System.out.println("两个稀疏数据 位图数组 byte size:"+bits4.length); }
运行截图:
关键词:
-
【报资讯】读C#代码整洁之道笔记05_使用工具改善代码和单元测试
1 & 160;高品质的代码1 1 & 160;性能(Performance)1 1 1 & 160;只执行需要的操作,而且执行...
来源: -
焦点快播:【金融街发布】人民银行上海总部:2月长三角地区人民币贷款增加6039亿元
2023年2月长三角地区人民币贷款增加6039亿元,外币贷款增加11亿美元;人民币存款增加7927亿元,外币存款...
来源: 【报资讯】读C#代码整洁之道笔记05_使用工具改善代码和单元测试
SaaS 营销怎么做?几点思考
Bitmap、RoaringBitmap原理分析
焦点快播:【金融街发布】人民银行上海总部:2月长三角地区人民币贷款增加6039亿元
大V实测百度AI画图:输入“刘慈欣” 打死也想不出画的是啥
每日时讯!海底捞回应孕妇可以插队:目前仅黑海会员有排队优先权益
当前滚动:中国移动:2023年营收将突破1万亿 利润或有史以来最高
当前观点:【新华财经调查】大全能源“逆势”扩产近两倍 坦陈今年终端需求不确定性较大
全球实时:德媒:纳格尔斯曼昨天还在与女友一起度假,今天就面临下课
ChatGPT又一个重磅功能插件系统上线 胡说八道的毛病治好了
焦点短讯!电影《铃芽之旅》预售票房破亿:3月24日上映
不速之约电视剧剧情
当前要闻:读Java性能权威指南(第2版)笔记26_性能测试方法下
前沿资讯!美国智库:25%美成年人吃不饱饭 很多人应急储蓄不足500美元
快播:crackme002-abexcm5
理想MPV预告图泄露 李想微博回应 还有5款纯电车型
微星发布第二款不用风扇的PCIe 5.0 SSD:又是尴尬的残血
贾跃亭真成了 法拉第未来宣布:FF 91将于3月30日开始生产
《CS》终于迎来一波超级大更新:有倒爷一晚上赚了几十万!
【天天聚看点】又吵上了热搜:网友称海底捞水果仅限打包一份
今年又有多少让人扶额的青团?
世界最资讯丨商务部:美方应尽早取消对华加征的301关税
每日时讯!5 Why 分析法,一种用于归纳抽象出解决方案的好方法
环球视点!day11-2-内置Tomcat的配置和切换
微服务实用篇--学习笔记
全球今日报丨C++ 标准库 sort() / stable_sort() / partial_sort() 对比
天天快讯:Docker 开始清退开源组织,不付费就删除所有私镜像怎么看
《暗黑破坏神4》B测神优化!N多RTX 3080 Ti惨遭黑屏变砖 暴雪:概不负责
天天新消息丨737 Max客机空难致346人丧生 波音最新表态:速度过快 乘客毫无痛苦地死去
海外爆发迄今最严峻禽流感疫情:专家详解
世界热点评!AMD终于能享受192GB内存了!连跑2小时0错误
当前热文:72.标准库类型vector
React的生命周期
关于使用AWS的CDN-CloudFront的费用计算及说明
全球即时:【财经分析】美联储连续第九次加息 抗通胀仍是主旋律
特斯拉一“咳嗽”:国内汽车行业加速洗牌了
《艾尔登法环》更新上线 终于加入了光追功能
如何知道自己怀的是男孩女孩?(如何知道自己怀的是男孩女孩)
全球最新:Styled Components 备忘清单_开发速查表分享
观热点:《艾尔登法环》光追配置需求公布:最低需RTX 3060 Ti
世界热门:48岁林志玲晒素颜近照:网友点赞笑容甜美状态好
天天日报丨DLL注入-Windows消息钩取
动态焦点:网络安全(中职组)-B模块:Web渗透测试
微信小程序原生AI运动(动作)检测识别解决方案
每日热闻!美联储表态已现温和迹象 市场仍存下半年降息“奢望”
天天最资讯丨中国人民大学苏州校区专业有哪些专业_中国人民大学苏州校区怎么样
焦点热讯:净利润翻倍超18亿元 爱玛电动车业绩大增送出股权激励
天天热点!1799元一台顶三台!小米米家无线洗地机2 Lite预售:吸拖洗都行
每日快看:蔚来CFO评价中国车企价格战:中国车企太多了
【快播报】私拉线路充电致17辆电动自行车被烧毁:科普飞线充电危害
今日要闻!华硕ROG新款XG Mobile显卡坞上市:搭载RTX 4090移动版 售价超2万
Vue 核心(一)
从零开始搞一个androidApp,实现h5自动更新、jsbridge
快资讯:“星月童话”来了!月掩金星天象明晚亮相:错过要等3年
天天百事通!女生疑在奶茶中喝出10余颗玻璃珠:店家回应
视点!黄金定价模式生变背后:央行们正失去对货币环境的控制
泉水煮蛋怎么做
记录--你还在傻傻的npm run serve吗?快来尝尝这个!
CloudQuery 社区重启 | 愿归来仍是少年
ChatGPT为我们带来了什么?
.net core 关于对swagger的UI(Index.html)或接口的权限验证;
每日头条!oracle学习之路(5)Navicat连接Oracle数据库:Oracle library is not loaded 解决方案
世界快资讯丨美联储鸽派声明缓解日本央行政策压力 日债收益率多数下跌
瑞士央行加息50个基点至1.50% 不排除进一步加息可能
全球短讯!常用消毒剂无效 致命真菌在美国蔓延:近半感染者90天内死亡
《龙马精神》推广曲《真心英雄》MV出炉:成龙郭麒麟重唱经典
环球聚焦:二手路虎变法拉利!男子80万买到泡水路虎 车商被判退一赔三
天天播报:CSAPP-Bomb Lab
全球快资讯丨Python工具箱系列(二十九)
视焦点讯!让业务容器化更安全便捷,阿里云容器镜像服务 ACR 推出免费制品中心
环球热点评!云服务器部署AI绘图记录
全球热资讯!pdf.js 使用
今日要闻!尿道结石怎么治疗才能除病根_尿道结石该怎么治疗
虚幻引擎5推出重磅新功能MetaHuman Animator:实现真人面部动作高速模拟
焦点速看:开放世界元宇宙游戏《仙剑世界》来了:万物皆可交互
焦点短讯!中华老字号!西安饭庄糕点礼盒19.9元冲量大促:一次买16枚
两女子高速上突然跳车:闻到汽油味、以为要爆炸
环球实时:阿里又开源一款数据同步工具 DataX,稳定又高效,好用到爆!
一周的时间搞一个疫苗预约系统
环球热消息:Apache Kafka JNDI注入(CVE-2023-25194)漏洞复现浅析
快讯:河北沧州2022年成人高考成绩查询入口已开通
当前时讯:【新华500】新华500指数(989001)23日低开高走涨0.88%
今日观点!女生10年收集万瓶香水价值一套房:圈粉超47万
世界热文:捐100亿元建世界一流名校 曹德旺:大学没有教会年轻人动手能力
【天天快播报】汽车疯狂降价潮引担忧:狂欢之后会不会是淘汰潮?
热推荐:【操作系统】面试题总结(持更)
天天简讯:权值(点分治)
当前速看:JavaScript学习笔记
环球最资讯丨WMS深入浅出
环球关注:剑指 Offer 17. 打印从 1 到最大的 n 位数(java解题)
环球观焦点:Intel 56核心刚出生就落伍!AMD Zen4撕裂者下半年来袭:96核心
【新视野】力压美国印度!中国富豪全球第一:钟睒睒蝉联首富 马化腾张一鸣紧随其后
石榴汁弄衣服上怎么洗才能不会变干(石榴汁弄衣服上怎么洗)
环球最资讯丨机箱中的海景房 乔思伯TK-1双曲面侧透游戏机箱579元:颜值爆表
成都比亚迪、特斯拉、宝马三车相撞 特斯拉和宝马车轮飞了
天天简讯:Go语言:利用 TDD 逐步为一个字典应用创建完整的 CRUD API
【世界播资讯】springcloud Stream整合rabbitmq消息驱动生产者踩坑
【天天报资讯】Vue之移动端viewport-vw适配
LevelDb-用户接口
世界视讯!Spring Cloud Alibaba微服务搭建(二)- 安装mysql