`
sxpujs
  • 浏览: 190037 次
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

RoaringBitmap更好的位图压缩算法分析

 
阅读更多
项目github源码:https://github.com/lemire/RoaringBitmap
论文Better bitmap performance with Roaring bitmaps http://arxiv.org/pdf/1402.6407.pdf

比较流行的位图压缩算法包括WAH, EWAH, Concise等,它们是基于RLE(Run-Length Encode,运行长度编码)来压缩的。RoaringBitmap可以比RLE的压缩算法更高。

Roaring Bitmap使用在 Apache Spark (https://spark.apache.org/) 和 Druid.io (http://druid.io/). Apache Lucene (http://lucene.apache.org/) 也使用 Roaring bitmaps, 虽然他们自己独立的实现。

Roaring Bitmap是将32位的整数分割成2的16次方个整数的数据块,来共享相同的16个最高有效位。使用专门的容器来保存它们的16个最低有效位。

当一个数据块整数不超过4096个时,使用一个16位整数的有序数组(在java中使用short类型数组)。当超过4096个整数时,我们使用2^16位的位图(在java中使用long类型数组)。因此我们有两种类型的容器,对于稀疏数据块的数组容器(ArrayContainer)和对于密集数据块的位图容器(BitmapContainer)。阈值4096保证容器的级别,每个整数使用不超过16比特。使用位图容器时,使用2^16来表示超过4096(=2^12)个整数,少于16比特/整数(2^16 / 2^12 = 2^4 = 16,如果值都充满long数组,最理想情况下1比特/整数)。使用数组容器时使用精确的16比特/整数。

为什么选择4096这个阈值呢?因为小于4096时,位图容器可能大于16比特/整数,大于4096时,数组容器会超过2^16(2^12 * 16 = 2^16),占用空间显然超过2^16这个低16位表示的数的容量。一句话,整数基数较小时,使用数组更省空间,基数较大时,使用bitmap更省空间。

这些容器保存在一个共享16个最高有效位的动态数组中:它们作为一级索引。使用数组保证高16位有序。我们认为一级索引一般很小。当n=1 000 000时,它至多包含16个实体。因此它应该保存在CPU缓存中。容器本身不应该使用超过8KB。




为了描述数据结构,考虑前1000个62的倍数(0, 62, 62*2, 62*3...62*1000),在2^16到2^16+100之间的所有整数,以及2 * 2^16至3 * 2^16之间的所有偶数。当对这个列表编码时,使用Concise格式,我们使用一个32位的填充字来对1000个62倍数的每一个字,使用两个额外的填充字来包含这个列表中在2^16到2^16+100之间的整数,以及在2 * 2^32到3 * 2^32之间的偶数保存成字面词(literal words)。在Roaring格式中,62的倍数和[2^16; 2^16 + 100) 之间的整数都使用16个比特表示一个整数的数组容器。[2 * 2^16; 3 * 2^16)之间的偶数保存在2^16个比特的位图容器中。

每个Roaring容器使用一个计数器记录它的基数(整数的数目)。因此计算Roaring位图的基数可以很快完成: 它需要最多累加2^16个计数器。它同样在支持排序和选择查询方面比典型的位图更快变得可能:排序查询累加集合比特在[0:1]范围内的数量,而选择查询寻找第i个集合比特的位置。

由于容器和动态数组导致的负载意味着我们的存储用量会超过16比特/整数。然而,只要容器的数量相比整数的总量很少,我们就不会使用超过16字节/整数。我们假设这里有比整数少得多的容器。更准确的说,我们假设密度一般会超过0.1%即n/|S|>0.001。当应用程序使用低密度(少于0.1%)的整数集合,位图就不是一种适当的数据结构。

展示出来的Roaring数据布局故意简单的。一些变化是可能的。对于非常稠密的位图,当每个容器中包括超过2^16 - 4096个整数,我们可以保存0比特的位置而不是2^16个比特的位图。而且我们可以更好的压缩连续整数的序列。我们留下这些可能性的研究作为将来的工作。

去检查一个32位的整数x是否存在,我们首先去查找x/2^16关联的容器,使用二分查找。如果一个位图容器被找到,我们访问第x对2^16余数个的比特。如果一个数组容器被找到,我们再次使用二分查找。

我们类似地插入和删除一个整数x。我们首先寻找相应的容器。当被找到的容器是一个位图,我们设置相应比特的值并更新基数。如果我们找到一个数组集合。我们使用二分查找并用线性时间的插入或删除。

当删除一个整数时,位图容器可能会变成一个数组容器如果基数达到4096。当增加一个整数,一个整数容器可能变成一个位图容器当它的基数超过4096。当这个发生时,创造新的容器并包括更新的数据而旧的容器被丢弃。从一个数组容器转换到位图容器是通过创建一个新的初始化为0的位图容器,并设置相应的比特。当转换一个位图容器到数组容器,我们提取出集合比特的位置,使用一个优化的算法。

逻辑运算:
我们在Roaring位图上实现了不同的操作,包括并集(OR操作)和交集(AND操作)。两个Roaring位图之间的位操作由迭代和比较一级索引上的16个高比特位的整数。为了更好的性能,我们维护排序的一级数组。在每次迭代中比较两个key。相同的,相应容器的二级逻辑操作也会操作。这总会生成一个新的集合。如果容器不是空的,它会添加到公共key上。然后迭代定位在一级数组加一。如果两个键不相等,包括最小键的数组递增一个位置,如果执行并操作,最低的键和一份对相应容器的拷贝添加到答案中。当计算并集时,我们重复直到两个一级数组被遍历完。当计算交集时,只要有一个数组遍历完成就终止。

排序的一级数组允许在O(n1 + n2)时间内进行一级比较,而n1和n2是对应的两个比较的数组的长度。我们也维护数组容器有序也是基于相同的优势。而容器可以用两种不同的数据结构,位图和数组,两个容器之间的一个逻辑并或交涉及到下面三种场景的一种:

涉及到三种容器的运算:
位图与位图,待完善。
位图与数组,待完善。
数组与数组,待完善。
  • 大小: 53.1 KB
1
1
分享到:
评论

相关推荐

    RoaringBitmap, 在Java中,一个更好的压缩 bitset.zip

    RoaringBitmap, 在Java中,一个更好的压缩 bitset RoaringBitmap Bitsets,也称为位图,通常用作快速数据结构。 不幸的是,他们可以使用太多的内存。 为了补偿,我们经常使用压缩位图。咆哮位图是压缩位图,它比传统...

    RoaringBitmap:Java中更好的压缩位集

    咆哮的位图在许多重要应用中均能很好地工作: 尽可能使用Roaring进行位图压缩。 不要使用其他位图压缩方法( ) 做出使我的软件运行速度提高5倍的荣誉(BigML的Charles Parker) 该库由 , , ( ) ( ) , ,

    redis-roaring:Redis咆哮的位图

    根据微基准测试,这些命令可以与Redis的O(1)操作本机位图具有相同的性能,并且O(N)调用的,同时比未压缩的对等方消耗的内存更少(基准测试未决)。 拉请求是受欢迎的。 依存关系 CRoaring(此redis模块使用的...

    bitmap switcher 位图转换

    bitmap switcher 位图转换 32位/24位/16位/8位/4位/1位 注:会提示不安全。请加入信任!

    位图解析算法

    位图解析算法文档提供位图解析的思路,给开发人员提供一种新的思路,来使位图的解析更加精准,可靠,错误率低。

    roaringbitmap:Cython中咆哮的位图

    咆哮的位图是一种有效的压缩数据结构,用于存储一组整数。 咆哮位图将一组32位整数存储在一系列数组和位图中,以空间最小的方式(始终为2 ** 16位或更小)。 此数据结构可用于存储大量整数,例如,用于搜索引擎和...

    rbitmap:roaringbitmap的位图工具

    读取bitmap./sbin/read test/uid.bitmap 3Note:It will print all data without limit.uid.txt必须是每行一个整型数据。#convent to bitmap;将文件转换为bitmap./sbin/fileToBitmap test/uid.txt test/uid.bitmap#...

    c# 实现位图算法(BitMap)

    主要介绍了c# 如何实现位图算法(BitMap),文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下

    图像压缩算法简介

    简单介绍网络编程中位图传输功能所使用的压缩算法

    大数据位图索引压缩算法研究

    随着Internet应用程序的日益普及和移动...除了在网络安全和网络取证中的应用之外,具有更快的按位逻辑运算和减少的搜索空间的位图索引压缩还广泛用于基因组数据,地理信息系统,图形数据库,图像检索,物联网等的分析中

    位图二值化算法

    位图二值化算法

    ucos优先级位图算法分析[归类].pdf

    ucos优先级位图算法分析[归类].pdf

    图像压缩与解压缩算法解析

    BMP文件被分成4个部分:位图文件头(Bitmap File Header)、位图信息(BitmapInfoHeader)、颜色表(Color Map)和位图数据(即图像数据,Data Bits或Data Body) 第1部分为位图文件头BITMAPFILEHEADER,是一个...

    位图查找算法

    位图查找算法

    VC_bitmap.rar_Bitmap save _vc Bitmap_保存位图

    vc++保存位图的实例文档,讲解vc++下位图保存的基本操作

    bmp位图分析工具 Bitmap Info Analyzer

    该小软件用于导出位图文件信息,以便分析其内部结构。

    位图压缩色深转换器

    位图压缩色深转换器位图压缩色深转换器位图压缩色深转换器位图压缩色深转换器

    Bitmap位图旋转范例

    Bitmap位图旋转范例 一个完整工程

    VC读取24位位图bitmap

    使用MFC读取24位的位图! 带测试方法,改为灰度图!

Global site tag (gtag.js) - Google Analytics