python - 提高 NDB 查询性能

标签 python google-app-engine optimization app-engine-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)

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

在重复属性中最多可以有几百个字符串。 事件模型中有几行 10.000 行。 在事件列表中只有几十个我想要获取的事件 ID。

最佳答案

我发现长列表(即大型 repeated=True 属性)的 Protocol Buffer 的反序列化开销非常小。

您在应用统计中查看过这个吗?您是否看到在 get_multi() 之后没有 RPC 执行的大空白区域?这就是反序列化开销。

我发现克服这个问题的唯一方法是删除长列表并在单独的模型中管理它们(即,完全避免重复的长属性列表),但是当然,您可能无法使用案例。

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

关于python - 提高 NDB 查询性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14861784/

相关文章:

java - appengine 上线程安全 java 的 list

c++ - 快速找出两组数的公约数

python - linux python 上的 Azure webapps 裸重定向到 www

python - 在 Python Spyder 中打开一个函数,就像我在 MATLAB 中所做的那样

Python函数式迭代算法?

python - 协方差不是正定的

python - 如何访问 GAE ndb Python 中的所有重复结构化属性

python - 将 *.appspot.com 重定向到自定义域 : Google app engine (Django)

java - 二叉树最大和级别 - 更好的设计?

SQL 查询 - 与连接相反?