2009-05-25 61 views
1

这适用于Google App Engine,但不一定受此限制。摊销适用于App Engine的分配(和百分比)计算?

在Google App Engine上,数据库不是关系数据库,因此不能实现聚合函数(如总和,平均值等)。每一行都是相互独立的。为了计算总和和平均值,应用程序只需通过重新计算每个新写入到数据库的数据来分摊计算,以便它始终保持最新。

如何计算百分位数和频率分布(即密度)?我想绘制一个值域的密度图,这组值可能是数百万的数量级。循环遍历整个数据集可能是可行的(每个查询的限制是返回1000行),并基于此计算,但我宁愿采取一些智能方法。

是否有一些算法可以计算或近似密度/频率/百分比分布,可以计算一段时间?

顺便说一句,数据是不确定的,因为最大值和最小值可能是全部的地方。因此,分布将需要大约95%的数据,并且仅基于该数据做密度。

回答

0

循环遍历整个数据集(每个查询的限制是返回1000行)可能是可行的,并基于此计算,但我宁愿做一些聪明的方法。

这是对我最明显的方法,你为什么试图避免它?

+2

GAE限制了操作可能需要多长时间以及数据存储区CPU时间。一切都以http请求完成,因此每个请求只有很多数据可以通过。如果采用更简单的方法,将大型工作划分为多个操作并合并结果可能会遇到麻烦。 – 2009-05-25 23:17:51

2

为了每行获得一个数字,一遍又一遍地获得整行(一次限制1000个)肯定没有吸引力。因此,通过在包含数字列表的单独实体中记录该单个数字来对数据进行非规范化处理(对于每个查询,我相信1 MB,因此每个列表的4个字节数不超过250,000个数字)。

所以当添加一个数字的时候也会获取最新的“增加的数据值列表”实体,如果全部换成新的,添加新的数字并保存。如果您认为统计数据中的一个小错误并不是真正的杀手,那么可能不需要进行交易。

如果可以更改项目的数据,则具有记录“已删除”数据值的相同类型的单独实体;将一个项目的值从23更改为45,将最新的“删除值”列表中的23加上,将最新的“加值”加上45,即可删除项目。

+0

但是,这是做什么?而不是每个数字的一​​行,我现在有一行25万个数字。如何使用? 您的回答让我觉得,如果樱桃为每1000个数字选择一个数字,这样我就可以得到一个统计相关的样本,这个样本也足够小,可以对数据进行计算...... – 2009-05-25 23:30:28