咆哮位图

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如何使用MVC设计模式观察嵌套对象   java将多个客户端连接到服务器   合并Java Web应用程序   Spring Security中未捕获java AuthenticationSuccessEvent   java Firebase JSON到Arraylist内部的Arraylist,存在对象问题   在Java15的sealedclasses特性中,final类和非密封类之间有什么区别?   java我可以使用数组。copyOf制作二维数组的防御副本?   java球不会在屏幕上移动   Java类如何在同一个文件中包含两个类?   java使用“Character.isWhiteSpace”删除所有空白   java阻止在RealmList中保存时创建领域对象   如何仅在ConnectionFactory上使用Java JMS身份验证   spring可以强制java对象在运行时实现接口吗?   socket无法在JAVA中使用TCP启用双工模式通信