从Google App Engine数据存储中获取随机记录?

时间:2010-06-09 03:55:25

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

我有一个数据存储区,模型中包含大约1,000,000个实体。我想从中获取10个随机实体。

我不知道怎么做?有人可以帮忙吗?

2 个答案:

答案 0 :(得分:22)

为每个实体分配一个随机数并将其存储在实体中。然后查询10个随机数大于(或小于)某个其他随机数的记录。

然而,这不是完全随机的,因为具有附近随机数的实体将倾向于一起出现。如果你想打败这个,可以根据十个随机数进行十次查询,但效率会降低。

答案 1 :(得分:4)

杰森霍尔的回答和the one here并不可怕,但正如他所提到的那样,他们也不是随意的。例如,如果将随机数全部组合在一起,即使进行十次查询也不是随机的。为了使事情真正随机,这里有两种可能的解决方案:

解决方案1 ​​

为每个数据存储区对象分配索引,跟踪最大索引,并在每次要获取随机记录时随机选择索引:

MyObject.objects.filter('index =', random.randrange(0, maxindex+1))

上升:真正随意。快。

Down-side :添加和删除对象时必须正确维护索引,这样可以使两个操作都成为O(N)操作。

解决方案2

在创建每个数据存储区号时为其分配一个随机数。然后,为了第一次获得随机记录,查询具有大于某个其他随机数的随机数的记录并按随机数排序(即MyObject.order('rand_num').filter('rand_num >=', random.random()))。然后将该查询保存为内存缓存中的游标。要在第一次获取随机记录后,从memcache加载光标并转到下一个项目。如果第一个之后没有项目,请再次运行查询。

为了防止对象序列重复,在每个读取的数据存储区中,为实体提供一个新的随机数并将其保存回数据存储区。

Up-side :真正随意。没有复杂的指数需要维持。

Down-side :需要跟踪光标。每次获得随机记录时都需要做一个put。