Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Решение 1

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

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

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

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

Решение 2

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

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

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

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