roaringbitmap 源码解析 bitmap add过程
最近在做标签平台的分析引擎。底层涉及到位图的处理,所以涉及到roaringbitmap。roaringbitmap 主要使用add and or xor remove serialize deserialize 等操作。roaringbitmap 主要容器container,以及所有实现,所有操作其实就是这些容器之间的操作。1、 RoaringBitmap 将整数i
最近在做标签平台的分析引擎。底层涉及到位图的处理,所以涉及到roaringbitmap。
原文地址:http://blog.csdn.net/chenfenggang/article/details/74611144
roaringbitmap 主要使用add and or xor remove serialize deserialize 等操作。
roaringbitmap 主要容器container,以及所有实现,所有操作其实就是这些容器之间的操作。
1、 RoaringBitmap 将整数int 分为了两部分,高位用key (short 【】)存储。公用高位,低位用container存储,而且当数据量小于4096时用arrayCotainer,高于4096时用bitmapContainer。
2、arrayCotainaer 用short【】数组存储。 bitmapContainer 将定义1024个long 数组。
每个long型数字64位。 1024个数组串联 刚好是1024×64 = 16位 = short 型数据。
3、以添加数据为例:
a)判断高位是否存在,如果不存在说明这个段【4098位数据】不存在。 如果不存在将new一个arrayContainer。
4)范围添加
直接将一个低位全部置1,直接采用位运算将一个区间的数据置1
5)arrayContainer 扩展。 arrayContainer 的扩展小于1024时时乘倍数扩展,大于1024的时候每次只扩展25%。
6)arrayContainer -》bitmapContainer 。到 低位个数 小于 1024采用。arrayContainer 大于4098时,采用bitmapContainer 1024个long更好。
1)优点,节约空间:1024个long 只相当于4098个short型。如果采用arrayContainer 表示所有的低位需要65 536个short数组。
2)arrayContainer因为每次插入数据都需要有序。而且数组长度在不停扩展。所有数组越长。查找和移位越多。需要时间更长。采用bitmapContainer 一开始定义好了,只涉及的位计算就像。快很多。
7)低位存储方面:
arrayContainer 能快速查通过key 找的位置; value即可存放数据的低位部分。
content为数组。x表示低位
bitmapContainer 通过 short /64 获取 1028long中的具体位置.获取现在的值,然后与1L移x位后的结果求或操作。
未完待续。。。。
更多推荐
所有评论(0)