【发布时间】:2013-06-06 20:50:52
【问题描述】:
就成本和可扩展性而言,提取大量数据的统计数据最有效的方法是什么?
让我们举个具体的例子,有 1000 家公司,每家公司都有 10000 多个客户。 这些公司都是零售业,或者让我们更笼统地说,他们是任何行业的任何公司,他们想从客户那里了解某些事情。
这些公司中有 10 家想知道他们的呼叫中心的表现如何,并发送一封电子邮件要求客户给他们打分 1 - 5,客户点击一个链接给他们打分 1 - 5。
这些公司中有 20 家(可能包括前 10 家中的一些)想要了解其他信息并要求评分为 1 - 5。
现在,如果我想向这些公司中的每一个提供反馈,了解他们的平均评分,或者他们与发送相同问卷或有重叠问题的其他公司相比在哪里堆积,计算这些统计数据的最佳策略是什么?
选项 1:有一个仅用于统计的特殊实体,每次客户对公司进行某项评价时,增加统计计数器(例如,增加投票数的统计计数器、投票总数、增加男性/女性计数器(如果您正在跟踪)基于性别等的投票) 这种方法的问题在于,您将为每个数据条目执行 y 次额外写入(其中 n 是您要跟踪的统计报告的数量),然后您还受限于您想要的那些统计信息追踪。此外,正如彼得在他的回复中提到的那样,您将被限制为 1 个写入/秒:Using Objectify to concurrently write data on GAE 如果 x 是条目数,y 是您想要提取的统计报告数,您将执行 x * y 写入和 y 读取以报告统计数据。
选项2:执行以下操作:ofy.query(MyEntity.class).filter("field", v).count(); 陷阱在于您正在查找所有这些实体,如果您正在计算导致 x 个实体的计数,GAE 是否会为读取 x 操作收费? 此外,如果您可能要运行 20000 个条目,您不会在超时、每个查询的最大读取数等方面达到某种限制吗? 根据我提取统计数据的频率,这意味着每次我提取统计数据时都会读取 x 次,假设我不会达到某些限制。
选项 3:在每个反馈条目中为您尝试构建的每条统计信息添加一个额外的属性。然后让调度程序每小时/每天/每周/ ...运行一次,使用游标运行每个条目,将统计列标记为已计数并将该值添加到统计实体。如果反馈条目的数量是 x 并且您想要提取 y 数量的关于此数据的报告,这意味着(假设您在内存中而不是立即在统计实体中进行计算)x 次写入以标记 x 反馈数报告为已计数,并且 y 数字每小时/每天/每周写入一次以存储更新的统计值。 这意味着对于 x 次反馈报告,我将至少执行 2 * x 次写入和仅 y 次读取来读取统计信息。
以上所有内容都看起来很糟糕,有没有更好的方法呢? 如果不是,上述哪种方法是更好的方法,当卷很大时不会中断,并且不会显着增加读取/写入/存储方面的成本。
【问题讨论】:
标签: google-app-engine google-cloud-datastore