【问题标题】:JDO on GoogleAppEngine: How to efficiently retrieve a subset of fields from a huge number of recordsGoogleAppEngine 上的 JDO:如何有效地从大量记录中检索字段子集
【发布时间】:2011-09-17 01:46:43
【问题描述】:

我面临一个可扩展性的小问题。我正在使用 JDO 来查询我的数据存储。 我需要检索给定实体的所有键(这些键的类型为 Long)。鉴于在我的数据存储中这样的实体有 1.000.000 条记录,我需要以一种非常有效的方式获取它们,以便在后台任务中循环这个集合。

哪种方法最有效?

如果我不仅需要密钥,还需要另一个字段怎么办?假设我有一个名为 TPImage 的实体:

    Long idPic; //this is my key
    String title; //this is the field I want to retrieve together with the key
    ... // other properties

如何在一个高效的查询中同时检索 idPic 和 title?

有点像

    Query q = new Query("select idPic, title from " + TPImage.class.getName());

但效率更高?

非常感谢!

再见 格格西

【问题讨论】:

  • 我修改了标题以反映您确实需要数据和键的事实。否则你可以只做一个键查询。

标签: java google-app-engine jdo


【解决方案1】:

您遇到的扩展问题是您需要所有密钥 - 并不是您无法足够有效地获取它们。无论您使用什么系统,这始终至少是 O(n)。

您应该分批完成工作,并使用cursors 有效地检索下一组结果,而不是尝试预取所有内容。

如果您需要模型中的字段,则必须检索整个模型实例 - 它们存储为序列化的 blob,因此无法仅检索一个字段。

【讨论】:

  • 所以,讨论到此结束:blob 序列化使我无法有效地仅获取对象字段的一个子集...非常感谢。
【解决方案2】:

您的问题分为两部分。对于第一部分,仅获取键,您可以通过将参数 keys_only 设置为 True 来指定查询只应在创建时返回键。 看这里: http://code.google.com/appengine/docs/python/datastore/queryclass.html#Query

这会有所帮助,因为您不会检索整个实体。但是,如果您想一次处理 1,000,000 个,它可能对您没有足够的帮助。在这种情况下,听从 Nick 的建议,分手吧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-01
    • 2016-07-29
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多