【发布时间】:2012-09-18 20:29:54
【问题描述】:
我正在尝试优化我的设计,但很难正确看待事物。假设我有以下情况:
A.一个用户有 1,000 个状态更新。这些更新存储在单独的实体状态中。我想获得一个用户的状态,它在日期 X 之后有一个 uploadDate。所以我做了一个查询:
statuses = Statuses.query(Statuses.uploadDate > X).fetch()
B.一个用户有 1,000 个状态更新。每个用户实体都有一个列表属性list_of_status_keys,它是用户状态的所有键的列表。我想在日期 X 之后使用 uploadDate 获取所有状态。所以我很容易使用statuses = ndb.get_multi(list_of_status_keys) 获取状态列表。然后我遍历每一个,检查日期:
for a_status in statuses:
if a_status.uploadDate > X:
myList.append(a_status)
我真的不知道我应该优化哪个。查询看起来更有条理,但通过键获取更快。有人有什么见解吗?
更新
归结为: 在对 GAE 的每个 http 请求中,我都会收到用户的所有通知和状态更新(就像 facebook 一样)。使用 Appstats,它告诉我每个请求花费 490 微便士(其中 1 便士 = 1,000,000 微便士)。
获取通知和状态对用户来说很重要,因此您可以期望他们多次这样做。我很难确定这是否很多。我吓坏了,试图以任何可能的方式最小化这个数字。我以前从未运行过服务,所以我不知道这是否应该花费多少。这是数学:
当没有返回结果时,每个请求花费 490 微便士(因此仅对于基本查询,它花费 490,但在某些情况下,当返回多个结果时,它可能花费 10,000 mp),所以对于 1 便士,我可以运行 2040请求,或者 1 美元,我可以运行 204,000 个请求。
假设我有 50,000 个用户,每个用户每天检查 75 次通知(合理):
75 requests X 490 mp per request X 50,000 users = 1,837,500,000 micropennies per day = 1837.5 pennies = 18.37 dollars per day.(是吗?)
我以前从未运行过大规模服务,那么这些是通常的成本吗?还是这太高了?每个请求 490 小便士是否高?如果需要,我将如何找到答案?
【问题讨论】:
-
那么,您更关心速度还是可读性?在第二种情况下,请注意循环也可以写成理解:
[s for s in statuses if s.uploadDate > X]。 -
@larsmans 可读性不是问题。我最关心的是成本,然后是速度,只要差异不大。
-
说可读性不是问题可能会在以后导致代价高昂的问题:) 你所说的成本到底是什么意思? (不熟悉 GAE。)
-
@larsmans 但让我感到困惑的是,如果用户有 100,000 条状态更新,则查询只会获取并在内存中保存我需要的那些,超过日期 X。但是,如果没有查询,我会得到所有 100,000 个状态并在内存中过滤。我只是不确定它如何与 GAE 一起工作(或在任何系统上)。
-
@JoranBeasley 我想让我感到困惑的是......机器可以过滤内存中的 100,000 个项目吗?这是一项昂贵的手术,还是很正常?
标签: python algorithm google-app-engine