我想分析一些数据(例如,Web 服务响应时间)并获取各种统计信息,主要是百分位数/分位数和突出值的存在。
我知道Statistics::Descriptive,但是,我不想将所有数据存储在内存中。另一方面,将我的结果降低几个百分点就可以了,我只关心巨大的差异。
所以我想出了以下想法:创建一个对数存储桶数组,并计算每个存储桶中的数据点。将数据分布在 6 个数量级并保证 1% 的精度仍然给我留下了6 * log 10 / log 1.01 =~ 1400
非常好的存储桶(36 kb 的内存,给定当前 Perl 的标量大小)。
计算百分位数很简单 - 只需将桶计数器相加直到$sum
超过$percentage * $total_count
。
但是,在我开始编写实际代码之前,我想问一下已经存在哪些内存高效统计模块(用于 Perl)和算法。
我发现了这个问题,并且在其中一个答案中提出了类似的方法。不过,还没有找到现成的 Perl 实现。
这是这个 Perlmonks question的略微编辑版本。