我有一个数据存储区,模型中包含大约1,000,000个实体。我想从中获取10个随机实体。
我不知道怎么做?有人可以帮忙吗?
答案 0 :(得分:22)
为每个实体分配一个随机数并将其存储在实体中。然后查询10个随机数大于(或小于)某个其他随机数的记录。
然而,这不是完全随机的,因为具有附近随机数的实体将倾向于一起出现。如果你想打败这个,可以根据十个随机数进行十次查询,但效率会降低。
答案 1 :(得分:4)
解决方案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。