2010-12-02 4 views
1

Мне нужно перебрать большую коллекцию (3 * 10^6 элементов) в Django, чтобы выполнить какой-то анализ, который не может быть выполнен с использованием одного оператора SQL.Итерация над большой коллекцией в django - проблема с кешем

  • Можно ли отключить сбор кэширования в django? (Кэширование всех данных не должно быть приемлемым, данные имеют около 0,5 ГБ)
  • Возможно ли сделать сборку django fetch в кусках? Кажется, он пытается предварительно собрать всю коллекцию в память, а затем перебрать ее. Я думаю, что наблюдение за скорость исполнения:
    • iter(Coll.objects.all()).next() - это занимает навсегда
    • iter(Coll.objects.all()[:10000]).next() - это занимает меньше, чем второй

ответ

1

Используйте QuerySet.iterator() ходить по результатам вместо загрузки их всех первый.

+0

Но это не швы, чтобы работать. Но это может быть ошибка в джанго. – 2010-12-02 09:58:26

1

Это означает, что проблема была вызвана базой данных базы данных (sqlite), которая не поддерживает чтение в кусках. Я использовал sqlite, поскольку база данных будет разбита после выполнения всех вычислений, но кажется, что sqlite не подходит даже для этого.

Вот что я нашел в исходном коде Джанго SQLite бэкэнда:

class DatabaseFeatures(BaseDatabaseFeatures): 
    # SQLite cannot handle us only partially reading from a cursor's result set 
    # and then writing the same rows to the database in another cursor. This 
    # setting ensures we always read result sets fully into memory all in one 
    # go. 
    can_use_chunked_reads = False 
Смежные вопросы