Seb*_*ers 3 python optimization google-app-engine app-engine-ndb
我正在寻求建议,我如何在速度方面改进:
我的数据模型:
class Events(ndb.Model):
eventid = ndb.StringProperty(required=True)
participants = ndb.StringProperty(repeated=True)
Run Code Online (Sandbox Code Playgroud)
我尝试获取数据的方式:
def GetEventDataNotCached(eventslist):
futures = []
for eventid in eventslist:
if eventid is not None:
ke = database.Events.query(database.Events.eventid == eventid)
future = ke.get_async(keys_only = True)
futures.append(future)
eventskeys = []
for future in futures:
eventkey = future.get_result()
eventskeys.append(eventkey)
data = ndb.get_multi(eventskeys)
Run Code Online (Sandbox Code Playgroud)
所以我得到了密钥异步,而不是将密钥传递给"get_multi" - 有没有其他方法可以让它更快,因为我仍然不满意性能.
在重复属性中,最多可以有几百个字符串.事件模型中有几万行.在eventslist中我只想获取几十个偶数.
小智 5
我发现长列表(即大repeated=True属性)的协议缓冲区的反序列化开销非常差.
你在appstats看过这个吗?你看到一个很大的空白区域,你的后面没有执行RPC get_multi()吗?这就是反序列化开销.
我发现克服这一点的唯一方法是删除长列表并在单独的模型中管理它们(即,完全避免长时间重复的属性列表),但当然,这可能不适用于您的用例.
所以最大的问题是:当你获得事件列表时,你真的需要所有参与者吗?或者你能否以某种方式推迟查找?例如,同步获取所有事件可能更便宜/更快,然后为每个事件(来自不同模型)的参与者提供异步提取并在内存中组合 - 也许您只需要最近注册的25个参与者或某些内容因此可以限制子查询的成本?
| 归档时间: |
|
| 查看次数: |
1049 次 |
| 最近记录: |