roaringbitmap 源码解析 bitmap add过程

时间:2024-03-29 22:03:44

最近在做标签平台的分析引擎。底层涉及到位图的处理,所以涉及到roaringbitmap。

原文地址:http://blog.csdn.net/chenfenggang/article/details/74611144

roaringbitmap 主要使用add and or xor remove serialize deserialize 等操作。

roaringbitmap 主要容器container,以及所有实现,所有操作其实就是这些容器之间的操作。

roaringbitmap 源码解析 bitmap add过程

1、 RoaringBitmap 将整数int 分为了两部分,高位用key (short 【】)存储。公用高位,低位用container存储,而且当数据量小于4096时用arrayCotainer,高于4096时用bitmapContainer。

2、arrayCotainaer 用short【】数组存储。 bitmapContainer 将定义1024个long 数组。 
每个long型数字64位。 1024个数组串联 刚好是1024×64 = 16位 = short 型数据。

3、以添加数据为例:

roaringbitmap 源码解析 bitmap add过程

 

a)判断高位是否存在,如果不存在说明这个段【4098位数据】不存在。 如果不存在将new一个arrayContainer。

roaringbitmap 源码解析 bitmap add过程

 

4)范围添加

roaringbitmap 源码解析 bitmap add过程

 

直接将一个低位全部置1,直接采用位运算将一个区间的数据置1

roaringbitmap 源码解析 bitmap add过程

 

5)arrayContainer 扩展。 arrayContainer 的扩展小于1024时时乘倍数扩展,大于1024的时候每次只扩展25%。

roaringbitmap 源码解析 bitmap add过程

 

6)arrayContainer -》bitmapContainer 。到 低位个数 小于 1024采用。arrayContainer 大于4098时,采用bitmapContainer  1024个long更好。

roaringbitmap 源码解析 bitmap add过程


1)优点,节约空间:1024个long 只相当于4098个short型。如果采用arrayContainer 表示所有的低位需要65 536个short数组

2)arrayContainer因为每次插入数据都需要有序。而且数组长度在不停扩展。所有数组越长。查找和移位越多。需要时间更长。采用bitmapContainer 一开始定义好了,只涉及的位计算就像。快很多。


7)低位存储方面:

arrayContainer 能快速查通过key 找的位置; value即可存放数据的低位部分。

content为数组。x表示低位

roaringbitmap 源码解析 bitmap add过程

 

bitmapContainer 通过 short /64 获取 1028long中的具体位置.获取现在的值,然后与1L移x位后的结果求或操作。

roaringbitmap 源码解析 bitmap add过程

 

未完待续。。。。