Перебрать большую коллекцию в django - проблема с кешем - PullRequest
1 голос
/ 02 декабря 2010

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

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

Ответы [ 2 ]

1 голос
/ 02 декабря 2010

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

Вот что я нашел в исходном коде django SQL-сервера:

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
1 голос
/ 02 декабря 2010

Используйте QuerySet.iterator(), чтобы просмотреть результаты, а не загружать их все сначала.

...