咆哮位图

roaringbitmap的Python项目详细描述


咆哮位图是存储集合的有效压缩数据结构 整数的。轰鸣的位图将一组32位整数存储在一系列 数组和位图,以占用空间最少的为准 2 ** 16位或更少)。

此数据结构对于存储大量整数非常有用,例如 搜索引擎和数据库使用的反向索引。尤其是 可以快速计算一系列集合的交集,可以是 用于将查询实现为子查询的连接。

此实现基于 https://github.com/lemire/RoaringBitmap 以及https://github.com/lemire/CRoaring

此实现的其他功能:

  • 倒排列表表示:存储大部分已满的块 紧凑地作为非成员数组(而不是作为成员数组或 固定大小位图)。
  • 可以使用 mmap在单个文件中。

缺少w.r.t.croaring功能:

  • 运行长度编码块
  • 各种AVX2/SSE优化

另请参见pyroaringbitmap,一个croaring的python包装: https://github.com/Ezibenroc/PyRoaringBitMap

许可证,要求

该代码是在gnu gpl v2或任何更高版本下授权的。

安装、使用

$ git clone https://github.com/andreasvc/roaringbitmap.git
$ cd roaringbitmap
$ make

(或者make py2对于python 2)

可以使用RoaringBitmap()替换普通的(可变的) 包含(无符号)32位整数的python集:

>>>fromroaringbitmapimportRoaringBitmap>>>RoaringBitmap(range(10))&RoaringBitmap(range(5,15))RoaringBitmap({5,6,7,8,9})

ImmutableRoaringBitmap是不可变的变量(类似于frozenset) 它作为一个连续的内存块紧凑地存储。

一系列不变的roaringbitmap可以存储在一个文件中,并且 使用mmap有效访问,无需复制或反序列化:

>>>fromroaringbitmapimportMultiRoaringBitmap>>>mrb=MultiRoaringBitmap([range(n,n+5)forninrange(10)],filename='index')>>>mrb=MultiRoaringBitmap.fromfile('index')>>>mrb[5]ImmutableRoaringBitmap({5,6,7,8,9})

用于API文档cf.http://roaringbitmap.readthedocs.io

基准

输出$ make bench

small sparse set
100 runs with sets of 200 random elements n s.t. 0 <= n < 40000
                set()  RoaringBitmap()    ratio
init         0.000834          0.00138    0.603
initsort      0.00085         0.000394     2.16
and           0.00102         8.49e-05     12.1
or            0.00171         0.000169     10.1
xor           0.00152         0.000213     7.11
sub          0.000934         0.000197     4.74
iand         1.29e-05         2.97e-06     4.35
ior           9.7e-06         3.26e-06     2.98
ixor         8.98e-06         3.43e-06     2.62
isub         6.83e-06          3.3e-06     2.07
eq           0.000438         1.17e-05     37.6
neq          6.37e-06         7.81e-06    0.816
jaccard        0.0029         0.000126     23.1

medium load factor
100 runs with sets of 59392 random elements n s.t. 0 <= n < 118784
                set()  RoaringBitmap()    ratio
init            0.564            0.324     1.74
initsort        0.696            0.273     2.55
and             0.613         0.000418     1466
or              0.976         0.000292     3344
xor             0.955         0.000294     3250
sub             0.346         0.000316     1092
iand          0.00658         1.14e-05      575
ior           0.00594         1.08e-05      548
ixor          0.00434         1.12e-05      385
isub          0.00431         1.09e-05      397
eq             0.0991         0.000116      851
neq          9.62e-06         1.29e-05    0.743
jaccard          1.62          0.00025     6476

dense set / high load factor
100 runs with sets of 39800 random elements n s.t. 0 <= n < 40000
                set()  RoaringBitmap()    ratio
init             0.33           0.0775     4.26
initsort        0.352            0.148     2.38
and              0.24         0.000223     1078
or               0.45         0.000165     2734
xor             0.404         0.000161     2514
sub             0.169         0.000173      973
iand          0.00287         6.02e-06      477
ior           0.00179         6.34e-06      282
ixor          0.00195         5.53e-06      353
isub           0.0017         6.35e-06      267
eq             0.0486         4.65e-05     1045
neq          1.01e-05         1.13e-05    0.888
jaccard         0.722         0.000118     6136

有关性能比较,请参见https://github.com/Ezibenroc/roaring_analysis/ 和这个图书馆。

参考文献

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何在运行时设置响应类型(Spring MVC)   java Selenium与BrowserMobProxy   java如何处理控制器(Swing)中的组件?   linux将metajava层添加到Yocto会导致解析失败   java存储X和Y坐标   java AssertJ检查JSONArray是否包含带有给定键和值的项的映射   java Redis客户端是否连接到多个aws读取副本端点?   java如何关闭对话框窗口上的按钮点击   java SHA256是否具有良好的跨平台支持?   java为什么这个if语句没有失败?   java无法在Spring中加载servlet上下文   java如何使用ApacheHWPF将图像插入文档文件   java SetWindowDisplayAffinity失败,错误为“拒绝访问”   当键盘出现时,java 安卓调整布局   C++中缓冲区的java替换