python – 提高NDB查询性能

我正在寻求建议,我如何在速度方面改进:

我的数据模型:

class Events(ndb.Model):
    eventid = ndb.StringProperty(required=True)
    participants = ndb.StringProperty(repeated=True)

我尝试获取数据的方式:

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)

所以我得到了密钥异步,而不是将密钥传递给“get_multi” – 有没有其他方法可以让它更快,因为我仍然不满意性能.

在重复属性中,最多可以有几百个字符串.
事件模型中有几万行.
在eventslist中我只想获取几十个偶数.

最佳答案 我发现来自长列表的协议缓冲区的反序列化开销(即,大的重复= True属性)非常差.

你在appstats看过这个吗?在get_multi()之后,您是否看到空格中没有执行RPC的大空白?这就是反序列化开销.

我发现克服这一点的唯一方法是删除长列表并在单独的模型中管理它们(即,完全避免长时间重复的属性列表),但当然,这可能不适用于您的用例.

所以最大的问题是:当你获得事件列表时,你真的需要所有参与者吗?或者你能否以某种方式推迟查找?例如,同步获取所有事件可能更便宜/更快,然后为每个事件(来自不同模型)的参与者进行异步提取,并在内存中进行组合 – 也许您只需要最近注册的25个参与者或其他内容因此可以限制子查询的成本?

点赞