【问题标题】:Google App Engine Projection Costs more than 1Google App Engine 投影成本超过 1
【发布时间】:2015-12-17 13:43:21
【问题描述】:

我正在尝试通过使用 Projection 来降低数据存储成本。我读过 Projection Query 只需 1 次读取操作,但在我的情况下,Projection 成本超过 1。这是代码:

      Query<Finders> q = ofy().load().type(Finders.class).project("Password","Country");
      for(Finders finder:q)
      {
          resp.getWriter().println(finder.getCountry()+" "+finder.getPassword());
      }

执行此操作时,q 对象包含 6 个项目,要检索这 6 个项目,它需要 6 次读取操作,如 Appstats 所示。 谁能告诉我这里出了什么问题?

【问题讨论】:

  • 我对objectify一无所知,但我相信您可以将结果作为列表获取或在查询中设置分块(批处理)率。您可能会发现迭代将每个结果作为单独的操作获取。
  • @TimHoffman 我的主要任务是通过一次读取操作获取所有项目。这就是我想使用投影查询的原因。

标签: java google-app-engine projection objectify


【解决方案1】:

要读取所有项目(如果它们都适合,则使用单个读取操作)在查询中调用.list(),以获取List&lt;Finders&gt;。您选择对查询进行迭代,这很可能不依赖于从数据存储区读取的单个可能巨大的数据,而是将更多内容打包出来。

投影进入图片的地方完全不同:如果您有具有许多字段的实体,或者某些字段非常大,并且在某些情况下您知道您只需要某个字段子集(尤其是如果它不需要“一些非常大的字段”),那么投影是一个非常明智的想法,因为它可以避免读取您不需要的内容。

这使得(例如)10 个实体的某个提取更有可能读取单个数据存储区 - 对于单个数据存储区读取的数据量存在字节限制,因此,如果通过仔细挑选和选择您实际需要的字段,您只读取(例如)每个实体 10k,而不是(例如)每个实体 500k,那么显然您可能需要从数据存储区读取更少的数据。

但是,如果您不使用 .list() 进行一次大规模读取,而是通过迭代逐个实体读取,那么您很可能仍然会获得多次读取——本质上,通过迭代,您已经说你想要那个!-)

【讨论】:

  • 感谢您的回复!...我将检索最多 100 个实体,所以如果我使用 .list(),它会导致 1 个读取操作还是 100 个读取操作?
  • 我对查询使用了 .list() 操作,但它显示了 6 个读取操作。那么,如何使用 list() 仅使用 1 个读取操作来检索条目?
猜你喜欢
  • 1970-01-01
  • 2012-02-11
  • 1970-01-01
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
相关资源
最近更新 更多