8

我正在为 java appengine 使用新的实验性任务队列,并且我正在尝试创建在我的数据存储中聚合统计信息的任务。我正在尝试计算我的数据存储区中所有实体(某种类型)中 UNIQUE 值的数量。更具体地说,假设 X 类型的实体有一个字段 A。我想计算我的数据存储区中 A 的唯一值的数量。

我目前的方法是创建一个任务来查询类型 X 的前 10 个实体,创建一个哈希表来存储 A 的唯一值,然后将此哈希表作为有效负载传递给下一个任务。下一个任务将计算接下来的 10 个实体,依此类推,直到我遍历所有实体。在执行最后一个任务期间,我将计算我的哈希表中的键数(一直从一个任务传递到另一个任务),以找出 A 的唯一值的总数。

这适用于我的数据存储中的少数实体。但是我担心一旦我有很多独特的值,这个哈希表会变得太大。appengine 任务的有效负载的最大允许大小是多少??????

你能建议任何替代方法吗?

谢谢。

4

3 回答 3

14

根据文档,最大任务对象大小为 100K

于 2009-12-22T03:11:21.240 回答
1

“你能建议任何替代方法吗?”。

为每个唯一值创建一个实体,方法是基于该值构造一个键并使用Model.get_or_insert. 然后Query.count使用正常的分页技巧将实体分批增加 1000 个(或者在您的请求超时之前可以计数的数量 - 超过 10 个)。

或者使用类似于文档中给出的代码get_or_insert来保持计数 - App Engine 事务可以运行多次,因此在事务中增加的 memcached 计数将是不可靠的。但是,这可能有一些技巧,或者您可以将计数保留在数据存储中,前提是您没有对实体父母做任何不愉快的事情。

于 2009-12-22T03:14:13.467 回答
0

这可能为时已晚,但也许有用。首先,无论何时您想要连续遍历一组实体,建议使用索引的 date_created 或 date_modified auto_update 字段。从这一点开始,您可以使用 json.dumps() 创建一个带有 TextProperty 的模型来存储您的哈希表。您需要做的就是传递最后处理的日期,以及哈希表实体的模型 ID。使用比最后一个日期晚的 date_created 进行查询,json_load() TextProperty,并累积接下来的 10 条记录。可以变得更复杂一些(例如,通过使用传递的参数和一些不同的查询方法来处理 date_created 冲突)。为下一个任务添加 1 秒倒计时,以避免因过快更新哈希表实体而出现任何问题。HTH,-步骤

于 2013-11-22T01:10:29.290 回答