内存高效的统计分配模块

Dal*_*aen 8 statistics perl

我想分析一些数据(比如网络服务响应时间)并获得各种统计信息,主要是百分位数/分位数和未完成值的存在.

我知道Statistics :: Descriptive,但是,我不想将所有数据存储在内存中.另一方面,将我的结果减少几个百分点就可以了,我只关心巨大的差异.

所以我提出了以下想法:创建一个对数桶阵列,并计算每个桶中的数据点.将数据分布在6个数量级并且保证精度为1%仍然留给我6 * log 10 / log 1.01 =~ 1400很好的存储桶(36 kb的内存,给定当前Perl的标量大小).

计算百分位数很简单 - 只需将桶计数器加起来直到$sum超过$percentage * $total_count.

但是,在我开始编写实际代码之前,我想问一下哪些内存高效的统计模块(对于Perl)和算法已经存在.

我发现了这个问题,其中一个答案提出了类似的方法.但是,还没有找到现成的Perl实现.

这是Perlmonks问题的略微编辑版本 .

Dal*_*aen 1

由于到目前为止我的搜索不成功,我启动了一个新模块Statistics::Descriptive::LogScale。希望它会有所帮助。

它通常遵循Statistics::Descriptive::Full API ,并添加了一些小的内容(例如添加任意幂的中心矩和标准化矩)。我还计划仔细研究一下Statistics::Descriptive::Weighted

#!/usr/bin/perl -w

use strict;
use Statistics::Descriptive::LogScale;

my $stat = Statistics::Descriptive::LogScale->new ();
while(<>) { 
    $stat->add_data(m/(-?\d+(?:\.\d*))/g);
};

# This can also be done in O(1) memory, precisely
printf "Average: %f +- %f\n", 
    $stat->mean, $stat->standard_deviation;

# This requires storing actual data, or approximating
foreach (0.5, 1, 5, 10, 25, 50, 75, 90, 95, 99, 99.5) {
    printf "Percentile($_): %f\n", $stat->percentile($_);
};
Run Code Online (Sandbox Code Playgroud)