У меня есть хранилище данных с примерно 1 000 000 объектов в модели. Я хочу получить 10 случайных объектов из этого.
Я не уверен, как это сделать? может кто-то помочь?
У меня есть хранилище данных с примерно 1 000 000 объектов в модели. Я хочу получить 10 случайных объектов из этого.
Я не уверен, как это сделать? может кто-то помочь?
Назначьте каждому объекту случайное число и сохраните его в сущности. Затем запрос для десяти записей, чье случайное число больше (или меньше) другого случайного числа.
Однако это не является полностью случайным, поскольку сущности с близкими случайными числами будут иметь тенденцию появляться вместе. Если вы хотите превзойти это, выполните десять запросов, основанных на десяти случайных числах, но это будет менее эффективно.
Решение 1
Назначьте индекс для каждого объекта хранилища данных, отслеживайте максимальный индекс и произвольно выбирайте индекс каждый раз, когда хотите получить случайную запись:
MyObject.objects.filter('index =', random.randrange(0, maxindex+1))
Потенциал: действительно случайный. Быстро.
Внизу: вы должны правильно поддерживать индексы при добавлении и удалении объектов, что может сделать обе операции O (N).
Решение 2
Назначьте случайное число каждому номеру хранилища данных при его создании. Затем, чтобы получить случайную запись в первый раз, запрос для записи со случайным числом, большим, чем какое-либо другое случайное число и порядок случайными числами (т.е. MyObject.order('rand_num').filter('rand_num >=', random.random())
). Затем сохраните этот запрос в качестве курсора в memcache. Чтобы получить случайную запись после первого раза, загрузите курсор из memcache и перейдите к следующему элементу. Если после первого элемента нет элемента, запустите запрос еще раз.
Чтобы предотвратить повторение последовательности объектов, в каждом чтении данных дайте сущности, которую вы только что прочитали, новое случайное число и сохраните его обратно в хранилище данных.
Вверх: поистине случайный. Нет сложных индексов для поддержки.
Вниз: нужно следить за курсором. Нужно делать ставку каждый раз, когда вы получаете случайную запись.