前言

位图索引被广泛用于数据库和搜索引擎中,通过利用位级并行,它们可以显著加快查询速度。但是,位图索引会占用大量的内存,因此我们会更喜欢压缩位图索引。 Roaring Bitmaps 就是一种十分优秀的压缩位图索引,我们统称 RBM。

这是之前在学习ElasticSearch的时候注意到的一种有意思的算法,整合了对几位大佬文章的理解,谈一下自己肤浅浅浅浅+65535的看法(bushi

前置知识

Bitmap

Bitmap的基本原理就是用一个bit 位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不存在的。以1表示存在,0表示不存在。

对于一个8位的Bitmap
如果对于(0,2,4,6)四个数
Value 1 0 1 0 1 0 1 0
Index 0 1 2 3 4 5 6 7

而对于一个bitmap来说,所占内存大小仅仅跟位数有关

1byte=8bit
1kb=1024byte对于一个16位的bitmap
所占内存大小=2^16/8/1024=8k

Array

这里我们只提一下内存情况,比较容易理解,Array的内存大小是随着元素个数增长而线性增长的

为什么要提内存情况后边会有涉及


RBM

我们以存放 Integer 值的 Bitmap 来举例,RBM 把一个 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

举个例子:

例如,0x00020032(十进制131122)放入一个 RBM 的过程如下图所示

0x00020032 的前 16 位是 0002,找到对应的桶 0x0002。在桶对应的 Container 中存储低 16 位,因为 Container 元素个数不足 4096,因此是一个 Array Container。低 16 位为 0032(十进制为50), 在 Array Container 中二分查找找到相应的位置插入即可(如上图50的位置)。

相较于原始的 Bitmap 需要占用 16K (131122/8/1024) 内存来存储这个数,而这种存储实际只占用了4B(桶中占 2 B,Container中占 2 B,不考虑数组的初始容量)。

使用bitmap容器也是类似

容器选择

上面我们提到了一个关于容器选择的阈值4096,那为什么当容量为4096时会成为阈值呢?

这里有大佬画了一张很形象的图

结合在前置知识中提到的内存问题,本算法的容器切换可以使得内存成本得到节省


总结

以上是本人对于RMB算法的一些浅薄理解

参考文章:

不深入而浅出 Roaring Bitmaps 的基本原理 - 码农教程

Roaring Bitmap更好的位图压缩算法 - 腾讯云开发者社区-腾讯云

浅析Roaring Bitmap---另一种位图压缩算法相关推荐

  1. 位图—BitMap和BitSet,布隆过滤器,Roaring Bitmap

    位图 简单来说就是为了压缩节省空间,才出现的. 举个例子: 你要是存储三个数字 2,5,10.这三个数字用java中的short类型来存储,也要6个Byte(short类型的内存空间是2Byte).一 ...

  2. 将Roaring Bitmap序列化为JSON

    近期在实现一个数据结构时使用到了位图索引(bitmap index)[1],本文就来粗浅聊聊位图(bitmap). 一. 什么是bitmap 位图索引使用位数组(bit array,也有叫bitset ...

  3. 精确去重和Roaring BitMap

    精确去重和Roaring BitMap 互联网行业常见的一个业务需求就是求UV(日活)和N日留存,这就涉及到去重计数(COUNT DISTINCT)的计算. BitMap概述 精确去重算法主要通过Bi ...

  4. Greenplum roaring bitmap与业务场景 (类阿里云RDS PG varbitx, 应用于海量用户 实时画像和圈选、透视)

    摘要: 标签 PostgreSQL , Greenplum , varbitx , roaring bitmap , pilosa , varbit , hll , 多阶段聚合 背景 roaring ...

  5. 网络营销专员浅析现阶段下的几种网络营销推广方式

    在当下的互联网发展潮流中企业选择网络营销已经屡见不鲜,网络营销推广服务可为企业开拓互联网市场提供助力深入挖掘潜在用户群体,从而达到为企业增加收益几率.不同行业企业之间所选择的网络营销推广方式也不尽相同 ...

  6. 浅析负载均衡的6种算法,Ngnix的5种算法

    转载自 浅析负载均衡的6种算法,Ngnix的5种算法. 常见的几种负载均衡算法 1.轮询法 将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统 ...

  7. Android图片加载之认识bitmap的四种加载方式

    Android的Bitmap有四种高效加载方式 从获取方式分: (1)以文件流的方式 假设在sdcard下有 test.png图片 FileInputStream fis = new FileInpu ...

  8. Roaring Bitmap原理

    Roaring Bitmap 最近面试字节,被问roaring bitmap原理,虽然之前看过,时间久了细节忘了,再次mark下,这篇文章讲的很透彻 Roaring Bitmap

  9. Bitmap 的四种压缩方式详解

    本文介绍了 Bitmap 压缩的四种方式,相关代码可见:Githhub-GdTestHub 文章目录 一.质量压缩 二.采样率 三.缩放法 四.RGB_565 Android 中图片是以 bitmap ...

最新文章

  1. windows RabbitMq 安装
  2. 交叉验证和超参数调整:如何优化您的机器学习模型
  3. 最高法院明确反向工程合法 腾讯诉PICA恐生变
  4. 教你用Python 编写 Hadoop MapReduce 程序
  5. 慢雾安全工程师:安全审计是目前保护 DeFi 项目安全最高性价比的方式
  6. 联想控制计算机软件,联想网络控制工具
  7. 遥感、GIS、计算机视频教程
  8. oracle 11 ora 12514,oracle 11g ORA 12514错误,我的解决办法
  9. 微信小程序-bug-页面不存在
  10. GEE|假彩色目视解译山东省玉米、水稻、小麦等样本集制作代码
  11. 锐龙r7 6800u和i5 12500h选哪个好 r76800u和i512500h对比
  12. 赶集网否认倒闭:是不是好公司,两三年后见分晓
  13. UNIX 时间戳总结
  14. 算法题:10级台阶,一次一步或两步,打印所有的走法
  15. 文科生与理科生_戏谈
  16. Cloudxns使用心得
  17. 实现了代码自动生成,开发效率妥妥的提升,升职加薪跟上
  18. Studio 3T for MongoDB脚本-----两种方法
  19. Python小白的数学建模课-01.新手必读
  20. 容联云完成内部调查:重新符合纽交所上市要求 仍未递交年报

热门文章

  1. vue动态加载VueI18n实现国际化
  2. 【学术相关】申请审核制下,到双一流大学读博的难度有多大?
  3. 单像空间后方交会(C语言)
  4. 华为v9计算机在哪方面的应用,华为新款笔记本电脑再爆料 软件方面是主要亮点或支持“快应用”...
  5. live555资料整合
  6. 数组在mysql中是什么类型_MySQL 中的数据类型介绍
  7. google 浏览器迅雷支持
  8. As Error:Execution failed for task ':app:processDebugManifest'.
  9. Linux常用命令——whoami命令
  10. matlab里信号增益gain,“增益/Gain”与“音量/Volume”间的重要区别