Roaring Bitmap的PHP扩展
由于PHP的数组占用比较多内存,在做DAU等统计的时候容易出现内存不足的情况。
后来发现了Roaring Bitmap算法,但是PHP没有对应的扩展。
所以在C/C++的CRoaring库基础上开发了一个PHP扩展,兼容PHP 5.6以及 PHP 7.0+。
项目的代码已经放上Githup 可以下载
php-roaring_bitmap-extension
- 对CRoaring进行封装的PHP扩展库,兼容 PHP 7.x & PHP 5.6,在 PHP 7.2.16 以及 PHP 5.6.30下测试通过
- githup上的CRoaring
- 文件夹里包含的roaring.h roaring.hh roaring.c是CRoaring的0.2.60版本,用amalgamation.sh生成的。因此编译本库不依赖其他额外的库。
- Roaring bitmap其中一个用途是非常高效的计算DAU以及留存(两个bitmap做and操作即可)等统计,解决PHP保存所有用户ID的原生数组占用过多内存的问题。
Install
- #cd /your/php-src-dir/ext
- git clone https://github.com/paultan63/php-roaring_bitmap-extension.git roaring_bitmap
- cd roaring_bitmap
- phpize
- ./configure
- make install
- #add extension=roaring_bitmap.so to php.ini
中文说明:
- 下载后将本目录改名roaring_bitmap并放进php的源代码目录,譬如php-7.xxx/ext/roaring_bitmap
- 进入这个目录,并且运行phpize && ./configure && make install
- 修改php.ini,将extension=roaring_bitmap.so加进去
Example(32 bit):
- All method accept 32 bit integer only
- If there is no requirement for 64-bit integers, 32-bit roaring_bitmap should be used for better performance.
$roaring = new roaring_bitmap;
$roaring->addMany(array(1,2,3));
$n = 3;
printf("contains %d: %d\n", $n, $roaring->contains($n));
$roaring2 = new