Bitmap压缩算法(RLE,ROARING)

1、关于bitmap
  bitmap是使用bit位来存储数据的一种结构,当数据有明确的上下界时,我们可以转换到bitmap去存储,比如0~8区间的数,如果使用int来存,则需要耗费32字节大小,如果使用位来存,只需要花费1个字节大小,相差32倍,在大数据量的情况下,比较节约空间,而且索引效率高。
  bitmap的缺点也很明显,首先,当数据比较稀疏时,bitmap显然比较浪费空间,如果要存储整个int32的数据,则需要512MB的空间大小,其次,无法对重复数据进行排序和查找。
  为了解决bitmap在稀疏数据集下浪费空间的问题,出现了几种改进算法,下面将结合实例来讲解。

2、RLE bitmap
  一种常见的思路是 run-length encoding(RLE)编码,其大致思想是对于bitmap中重复的值(很多个0或者很多个1),采用值加上重复出现的次数表示,从而起到压缩的目的。这种算法包括Oracle’s BBC、WAH、EWAH、 Concise等。我们从WAH开始,介绍一下压缩思路的改进
  WAH(Word Aligned Hybrid)是在Fastbit项目中提出的,这个算法的核心在于两点:Word Aligned和Hybrid,其中,Word Aligned利用现代CPU特性:操作Word比Byte效率高,所以首先会以Word为单元对bitmap数组进行分割,而Hybrid思想是对一个Word的数据格式进行分类处理。
  把现存的Word分为两类:literal words和fill words,如果一个Word是全0或者全1,它就是fill words,否则就是literal words,WAH只对fill words有压缩,如图所示:
Bitmap压缩算法(RLE,ROARING)_第1张图片

  EWAH(Enhanced Word Aligned Hybrid)则是对WAH对索引进行改进的一种做法,这种算法在WAH的基础上加了一个32bit的Header,用以记录后续的group个数,Header结构如下图所示:
在这里插入图片描述
  CONCISE(Compressed N Composble Integer Set)也是对WAH做的一个优化。如果在连续的0序列中有一个1,或者在连续的1序列中有一个0,那么这个特异数所在的Word就不能被压缩,CONCISE算法针对这种情况,单独设置了5bit的“反转位”记录了这个特异数的位置,然后将其0-1,1-0反转,此算法的结构如下:
Bitmap压缩算法(RLE,ROARING)_第2张图片
3、Roaring_bitmap
  基于RLE的思路有两个明显的问题:

  • 当插入或者查询时,必须decompress之后才能check
  • 某些情况下,业务需要对两个bimap求位运算,这时不能跳过大部分全0或者全1的区间。

  而Roaring算法提供了另外的思路来处理压缩的问题,其思路为:

  • 对于32位的整数,每2^16个数分成一组,称为一个容器
  • 一个容器如果包含的数小于4096个,认为其比较稀疏,用有序数组容器(ArrayContainer)进行保存。
  • 对于元素个数大于4096的容器,认为是一个密集数据块,使用2^16bit的bitmap进行保存。
  • 每个 Roaring 容器都会维护一个计数器用以存储该容器的基数,从而能够通过计数器求和快速获得一个Roaring Bitmap的基数大小。容器计数器的存在,还能够快速确定一个整型所属的容器,以及支持 bitmap
    某个位置值的高效查询。

  基于Roaring的操作如下:
  对于检索而言,判断某个整数 X 是否存在,首先通过 X/2^16获得一级索引,定位到所在的桶。如果桶容器是一个 bitmap,检查 X mod 2^16这个 bit 位,如果桶容器是一个数组,则使用二分查找。
  对于位运算而言,分成以下情况:

  1. Array vs Array,直接 merge 两个 Array;
  2. Array vs Bitmap,遍历 Array,把 Array 中的值依次映射到 bitmap 上并操作;
  3. Bitmap vs Bitmap,直接按位操作即可

roaringbitmap的论文:https://arxiv.org/pdf/1402.6407.pdf
roaringbitmap的一个c语言实现:https://github.com/RoaringBitmap/CRoaring

reference:
http://f.talkingdata.com/uploads/article/20171107/0f1e7768eee7ea37f8915e4839560a41
http://www.liaojiayi.com/bitmap/
https://blog.csdn.net/njpjsoftdev/article/details/52955638
https://bug1874.com/03-22-2017/bitmap-compress-algorithm.html

你可能感兴趣的:(Bitmap压缩算法(RLE,ROARING))