【发布时间】:2013-11-05 06:24:15
【问题描述】:
我有一个以特定速率到达的 int 值流。每 5 分钟,我想根据这些值计算一些百分位数,然后重新开始。
问题:我不想浪费太多内存,所以我只想保留几个 KB 的值。如果我的缓冲区在 5 分钟内没有填满,我可以完美地计算百分位数。但是,如果缓冲区确实填满,我想开始删除一些值(可能使用reservoir sampling 和此处建议的随机驱逐 - Percentiles of Live Data Capture)。不幸的是,我找不到在这两种情况下都适用的解决方案 - 如果缓冲区未满,我不想驱逐或忽略值,一旦它满了并开始驱逐,我总是会引入偏见。
【问题讨论】:
-
缓冲区的大小是多少?
-
大小可配置。现在我有 10,000 个整数 = 40KB。我可以使它更大,但由于我无法知道将到达多少值 - 这可能会随着时间的推移而发生很大变化 - 我选择的每种尺寸都可能不够。简单地扔 10MB 就太浪费了。
标签: algorithm resampling percentile streaming-algorithm