Доброго времени суток, друзья.
Есть база данных PostgreSQL с двумя таблицами. В первой - около 3 миллионов записей (ссылки в интернет). Так уж вышло, что для получения второй таблицы, нужно пройтись по всем строкам из первой таблицы, взять ссылку, сделать некие манипуляции в интернете и записать результат (для каждой записи в первой таблице соответственно 200+ записей во второй).
Суть проблемы:
Самый очевидный подход:
for i in Item.objects.all():
doSomething(i)
На тестовых данных в 10 тысяч записей этот подход работал на ура - данные очень
быстро оказывались в моих руках, но на реальных данных компьютер просто подвисает на неопределенный срок и мне не остается ничего, кроме нажатия на кнопку
reset.
Читал на Хабре, что этот подход абсолютно неверный, т.к. он создает N+1 запросов к базе данных.
Исправил вот так:
items = list(Item.objects.all())
for i in items:
doSomething(i)
Но поведение компьютера не изменилось - пришлось опять ресетить.
Прошу, подскажите, пожалуйста, выход из ситуации. Возможно, можно получать данные из БД пачками меньших размеров (придется переписывать много кода, если это - единственный вариант)? Или, возможно, стоит попробовать вручную составить запрос к БД, не пользуясь Django ORM?
Возможно, я что-то кардинально делаю не так, но мне необходимо хранить все эти данные на сервере, чтобы пользователи имели к ним максимально быстрый доступ.