【问题标题】:How to avoid datastore_v3.Next calls如何避免 datastore_v3.Next 调用
【发布时间】:2018-03-29 05:25:35
【问题描述】:

我的数据存储处理需要很多时间。 因此,我使用 StackDriver -> Trace 检查了哪些过程需要时间。 然后,多次调用“datastore_v3.Next”。

我找到了以下文件。 https://cloud.google.com/appengine/docs/standard/python/tools/appstats

数据存储区查询通常涉及一个 datastore_v3.RunQuery 后跟 零个或多个 datastore_v3.Next 调用。 (RunQuery 返回前几个 结果,因此 API 仅在获取许多结果时使用 Next。 避免不必要的 Next 调用可能会加速您的应用!)

但是,我不明白

  • 什么情况下会多次调用datastore_v3.Next?
  • 如何避免 Next 调用?

添加: MyCode 在下面

    @classmethod
    def get_foo(cls, user_key, foo):
      search_key = ndb.Key('UserInformation', user_key.id(), 'Foo', foo)
      return search_key.get()

UserInformation 和 Foo 种类有 100 万个实体。

【问题讨论】:

  • 遍历查询对象调用 Next,这是一种典型的使用模式。您能否提供您跟踪的呼叫的代码?
  • 谢谢。我添加了我的代码。
  • 您是否在代码的任何部分都在循环中获取实体?
  • 不在循环中。但它通过 Mapreduce 被多次调用
  • 您能否提供更多信息、更多范围,尤其是 MapReduce 部分?代码?

标签: google-app-engine google-cloud-datastore app-engine-ndb google-app-engine-python


【解决方案1】:

主要方法是the doc 中提到的方法,只是不要返回不必要的大结果集。

如果您只关心查询中的前几个结果,您可以考虑使用fetch,它可以返回有限的结果集而不是全部结果。

另外,你也可以好好利用memcache on NDB,更少的datastore调用意味着更少的.Next调用整体。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 2011-01-11
    相关资源
    最近更新 更多