RoaringBitmap和Bitmap的区别与原理

背景

此文只针对应用于实时数仓、离线数仓领域的标签圈选问题。以企业为例,企业和标签之间一般是多对多的关系,这种情况下对于计算不同标签下的企业数量,或者查询不同企业对应的标签会有较大的性能压力。因此使用Bitmap或者RoaringBitmap就是很好的选择【可能不好理解、往下看】。

BitMap

原理

例如将[0,1,2,3] 存起来
1
解释:这是一种位图方式的存储。以value作为key,下标作为value。本质上是一个二进制的数组,Bitmap最大支持的位数是2^32位,这可以节省很大的空间。例如将196660这个数存起来,大概需要196660/8/1024 = 24K 的内存 【因为整个数组长度为196660】

应用场景

对于一些需要计算连续登录天数,某些int值是否存在等等场景是非常合适的

缺点

如果整个数组中,值的分布很稀疏 ,例如上述长度为196660 的数组,只表示了这一个值存在,使用Int 去存储的话,4Byte 就可以满足。在大量出现这种情况的时候,是非常消耗内存的。所以RoaringBitmap比起bitmap在这方面就更具有优势。

RoaringBitmap

官网链接:https://roaringbitmap.org/

原理

以存放 Int 值的 Bitmap 来举例,把一个 32 位的 Integer 划分为高 16 位和低 16 位,通过高 16 位找到该数据存储在哪个桶中(高 16 位可以划分 2^16 个桶),把剩余的低 16 位放入该桶对应的 Container 中。

每个桶都有对应的 Container,不同的 Container 存储方式不同。依据不同的场景,主要有 2 种不同的 Container,分别是 Array Container 和 Bitmap Container。Array Container 存放稀疏的数据,Bitmap Container 存放稠密的数据。若一个 Container 里面的元素数量小于 4096,使用 Array Container 来存储。当 Array Container 超过最大容量 4096 时,会转换为 Bitmap Container
2

应用场景

针对某些Int 值分布很稀疏,RoaringBitmap则会比bitmap更加节省存储或者内存,两者应用场景类似,但是前者在存储上作了进一步优化。
例如以196660 这个值为例 ,它的16进制为00030034 ,前16位是0003,后16位是0034 ,所以存储在0X0003这个桶中,将后16位的值 52 存储到Container中

看到这里,在离线标签,或者实时标签计算完成后,将某标签下的企业唯一id值【Int类型】用RoaringBitmap存储,这样在存储上就节省了大量的空间,同时在计算组合标签下的企业数量性能也会快速提升

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值