【问题标题】:Fetch large JSON from Datastore从数据存储中获取大型 JSON
【发布时间】:2017-03-06 06:10:40
【问题描述】:

我在 Google Cloud Endpoints 上创建了一个 API,用于从 Datastore 中的单个实体获取所有数据。 NoSQL 请求(一个非常简单的请求:Select * from Entity)是使用 Objectify 执行的。

这个数据存储实体由 200 行(实体)填充,每行(实体)都有一个相同类型的子实体列表:

  • 餐食:
    • 字符串标题
    • int准备时间
    • List listOfIngredients(子实体...)
    • ...

所以当我获取 API 时,会返回一个 JSON。它的大小约为 641Ko,有 17K 行

当我查看 API 资源管理器时,它告诉我请求需要 4 秒才能执行:

我想减少那个时间,因为它真的很高……我已经:

  • 将 GAE 实例增加到 F2
  • 启用内存缓存

这有点帮助,但我认为这不是最有效的方法......

我应该使用 Big Query 更快地生成 JSON 文件吗?或者也许还有其他解决方案?

【问题讨论】:

  • 检查(在 appstats 或真实的 GAE 请求跟踪中)数据存储区/memcache RPC 调用本身的持续时间 - 因为它们发生在 GAE 后端,在您的应用程序之外,您无能为力。对于此类大数据,JSON 数据解码/编码操作可能会很长,请检查您的应用中是否存在任何不必要的此类操作。进一步升级实例类型应该有助于解决必要的问题。
  • 还要查看投影(可能还有 keys_only?)查询以减少处理的数据量 - 如果您的请求响应中实际上不需要所有这些数据。见cloud.google.com/appengine/docs/python/ndb/projectionqueries

标签: google-app-engine google-cloud-datastore google-cloud-endpoints


【解决方案1】:

您需要一个请求中的所有实体吗?

  • 如果不是,那么您可以使用 Cursor Queries 批量获取实体并根据需要显示,例如:一次获取 20 或 30 个实体,具体取决于您的需要。
  • 如果是
    • 您的用餐实体是否经常变化
      • 如果否,您可以生成一个 json 文件并将其存储在 GCS 中,并且每当您的实体发生更改时,您都可以更新 json 文件,这样在客户端获取将更快并且使用 etag header,新内容可以轻松拉取
      • 如果是, 那么我认为批量获取只是拉动这些实体的有效方法

【讨论】:

  • 谢谢!我会尽快检查并在这里发布代码
猜你喜欢
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
  • 2014-02-28
  • 1970-01-01
  • 1970-01-01
  • 2012-02-24
  • 2020-07-25
  • 2020-05-20
相关资源
最近更新 更多