Выбираете случайную запись из хранилища данных Google App Engine? - PullRequest
20 голосов
/ 09 июня 2010

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

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

Ответы [ 2 ]

22 голосов
/ 09 июня 2010

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

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

4 голосов
/ 09 июля 2012

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

Решение 1

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

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

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

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

Решение 2

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

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

Верх : действительно случайный.Нет сложных индексов для обслуживания.

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

...