我正在批量生成数据,这些数据存储在MongoDB中。每个文档的数值均大于0,我们将其称为x
和其他各个字段。
我需要使用特定过滤器计算所有文档中从0到100的所有分位数/百分位数。数据集变得越来越大,要使用过滤器查询获取所有文档,然后计算百分位数会花费太长时间,并给MongoDB带来太大压力。
因此,现在我正在研究如何以某种方式聚合数据,从而可以更快地计算0-100分位数。我想计算1个或多个批次的汇总,然后从这些汇总中计算百分位数。 1批包含10、250或500个文档。一个想法是计算批次的0-100的百分位数并保存。在计算总百分位数时,我将计算汇总百分位数的百分位数。我知道这会导致数据丢失,但是我认为这是可以忍受的。 是否有更好的方法以有意义的方式聚合数据,从而使百分位数的计算时间最小化(并且对MongoDB的查询大小)并且准确性很高?
在计算从0到100的准确百分位数时,让您了解x
-值的分布方式:
对于某些“数据组”(由过滤器确定),百分位数0到90从20
到100
几乎是线性的,然后对于第99个百分位数上升到138
指数级,最大值为> 15.000
对于另一个“数据组”,百分位数0到15从20
上升到600
,然后在第90个百分位数稳定到750
,在第99个百分位数上升到1050
,其中最多3000
。
因此,按桶进行聚合可能很困难。如果在第99个百分位数之前都准确无误,那我就可以保存最大值。