Получение случайной записи из хранилища данных Google App Engine?


У меня есть хранилище данных с примерно 1 000 000 сущностей в модели. Я хочу получить 10 случайных объектов из этого.

Я не уверен, как это сделать? может кто-нибудь помочь?

2 20

2 ответа:

Назначьте каждой сущности случайное число и сохраните его в сущности. Затем запросите десять записей, случайное число которых больше (или меньше) некоторого другого случайного числа.

Это не совсем случайно, однако, так как объекты с соседними случайными числами, как правило, появляются вместе. Если вы хотите обойти это, сделайте десять запросов, основанных на десяти случайных числах, но это будет менее эффективно.

Ответ Джейсона Холла итот, что здесь , не ужасны, но, как он упоминает, они также не являются случайными. Даже выполнение десяти запросов не будет случайным, если, например, все случайные числа сгруппированы вместе. Чтобы сохранить вещи действительно случайными, вот два возможных решения:

Решение 1

Назначьте индекс каждому объекту хранилища данных, следите за максимальным индексом и случайным образом выбирайте индекс каждый раз, когда вы хотите получить случайный индекс. запись:

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

Upside : действительно случайный. Быстро.

Down-side : вы должны правильно поддерживать индексы при добавлении и удалении объектов, что может сделать обе операции операцией O(N).

Решение 2

Назначьте случайное число каждому номеру хранилища данных при его создании. Затем, чтобы получить случайную запись в первый раз, запросите запись со случайным числом, большим, чем какое-либо другое случайное число, и упорядочите по случайным числам (то есть MyObject.order('rand_num').filter('rand_num >=', random.random())). Затем сохраните этот запрос в виде курсора в memcache. Чтобы получить случайную запись после первого раза, загрузите курсор из memcache и перейдите к следующему пункту. Если после первого элемента нет элемента, выполните запрос еще раз.

Чтобы предотвратить повторение последовательности объектов, при каждом чтении хранилища данных дайте сущности, которую вы только что прочитали, новое случайное число и сохраните его обратно в хранилище данных.

Up-side : действительно случайный. Никаких сложных индексов, чтобы поддерживать.

Down-side : необходимо отслеживать курсор. Нужно делать пут каждый раз, когда вы получаете случайную запись.