【问题标题】:Amortizing the calculation of distribution (and percentile), applicable on App Engine?摊销适用于 App Engine 的分布(和百分位数)计算?
【发布时间】:2009-05-25 22:59:07
【问题描述】:

这适用于 Google App Engine,但不一定受此限制。

在 Google App Engine 上,数据库不是关系型数据库,因此无法实现聚合函数(例如 sum、average 等)。每行相互独立。要计算总和和平均值,应用程序只需通过重新计算对数据库的每个新写入来摊销其计算,以便它始终是最新的。

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

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

顺便说一句,数据是不确定的,因为最大值和最小值可能无处不在。因此,分布必须采用大约 95% 的数据,并且仅基于此进行密度。

【问题讨论】:

    标签: algorithm google-app-engine frequency amortization


    【解决方案1】:

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

    所以当添加一个数字时,还要获取最新的“添加的数据值列表”实体,如果满了就创建一个新的,附加新的数字,保存它。如果统计数据中的微小错误不是致命的,那么可能不需要事务处理,正如您所暗示的那样。

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

    【讨论】:

    • 但这有什么作用呢?我现在有一行 250,000 个数字,而不是每个数字的一​​行。那怎么能用呢?你的回答让我觉得如果我为每 1000 个数字挑选一个数字可能会起作用,这样我就可以获得一个统计相关的样本,该样本也足够小,可以对...进行计算。
    • 每 25 万个数字有一个实体,因此在 1000 行内可以有 2.5 亿个数字。正如您所说的“这组值可能是数百万”而不是数亿,您应该能够在单个查询中取回相关数据并执行您想要的任何处理(如果超过一个切片CPU 时间,当然,以合理的增量将工作本身分割)。
    • 嗯,有道理。那时我将需要尝试这种可能性。谢谢。
    【解决方案2】:

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

    这对我来说是最明显的方法,你为什么要避免它?

    【讨论】:

    • GAE 对操作需要多长时间以及数据存储 CPU 时间设置了限制。一切都是作为 http 请求完成的,因此每个请求只能处理这么多数据。如果有更简单的方法,将一项大工作分成多个操作并将结果组合起来可能会很麻烦。
    猜你喜欢
    • 1970-01-01
    • 2012-12-09
    • 2011-12-29
    • 2013-06-20
    • 2021-12-26
    • 2021-12-02
    • 2021-02-26
    • 2011-12-09
    • 2016-07-28
    相关资源
    最近更新 更多