在我们的业务场景中需要计算UV或者IP之类的bitmap信息,使用hashset之类的解决方案对内存开销较大,因此引入了基数估算,当前的应用是使用JAVA。下面给出一些测试数据。
AdaptiveCounting库:
<dependency>
<groupId>com.clearspring.analytics</groupId>
<artifactId>stream</artifactId>
<version>2.7.0</version>
</dependency>
Adaptive Counting(简称AC)在“Fast and accurate traffic matrix measurement using adaptive cardinality counting”一文中被提出。其思想也非常简单直观:实际上AC只是简单将LC和LLC组合使用,根据基数量级决定是使用LC还是LLC。具体是通过分析两者的标准差,给出一个阈值,根据阈值选择使用哪种估计。
计算过程:
使用五个AdaptiveCounting实例,均衡去offer目标数据,最后merge再得到统计数据
每个实例有2的11次方桶(内存开销2K),
总量10W | 总量100W | 总量1W | |
Acc_1 | 19811 | 202299 | 2046 |
Acc_2 | 19426 | 203466 | 1982 |
Acc_3 | 19684 | 193985 | 2014 |
Acc_4 | 20075 | 204294 | 2038 |
Acc_5 | 20328 | 206519 | 1974 |
Acc_m | 100467 | 999819 | 10030 |
总量10W | 总量100W | 总量1W | |
Acc_1 | 18738 | 217824 | 1901 |
Acc_2 | 22044 | 199746 | 2142 |
Acc_3 | 19097 | 197594 | 1850 |
Acc_4 | 20105 | 226853 | 2007 |
Acc_5 | 18090 | 216648 | 1906 |
Acc_m | 102892 | 1013953 | 9784 |