GoogleAppEngine上的JDO:如何从大量记录中有效地检索字段子集

时间:2011-09-15 12:23:30

标签: java google-app-engine jdo

我面临一点可扩展性问题。我正在使用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());

但效率更高?

非常感谢!

再见 cghersi

2 个答案:

答案 0 :(得分:1)

你遇到的缩放问题是你需要所有的键 - 而不是你不能有效地获取它们。无论你使用什么系统,这总是至少是O(n)。

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

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

答案 1 :(得分:0)

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

这会有所帮助,因为您没有检索整个实体。但是,如果您想一次处理1,000,000个,那么它可能对您没有帮助。在这种情况下,请听取尼克的建议并分解工作。