Я стараюсь избегать использования большого количества памяти при цикле всех объектов в таблице базы данных, поэтому я использовал этот ответ.
В процессе разработки мой скрипт использует 344,086 МБ вПик.
Я использовал профилировщик памяти, чтобы установить точку останова 500 МБ, и каждый раз она достигает точки останова на for row in paginator.page(page).object_list
Мой код выглядит так:
paginator = Paginator(PageURL.objects.all().order_by('id'), 20)
for page in range(1, paginator.num_pages + 1):
print "page"
for row in paginator.page(page).object_list:
print "row"
Вывод такой:
# python -m memory_profiler scraper.py
page
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
done processing page 1
page
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
done processing page 2
page
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
done processing page 3
page
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
done processing page 4
page
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
done processing page 5
page
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
done processing page 6
page
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
done processing page 7
page
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
done processing page 8
page
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
done processing page 9
page
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
done processing page 10
page
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
done processing page 11
page
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
row
done processing page 12
page
row
row
row
row
row
row
row
row
row
row
row
row
Killed
От dmesg:
[971307.833602] Out of memory: Kill process 1433 (mysqld) score 225 or sacrifice child
[971307.834051] Killed process 1433 (mysqld) total-vm:1181928kB, anon-rss:228560kB, file-rss:0kB
Все объекты находятся в одно и то же время. Я не понимаю, как for row in paginator.page(page).object_list
увеличивается в размерах.
При мониторинге top
процент памяти постоянно увеличивается.
Понятия не имею, почему нумерация страниц постоянно увеличивает использование памяти или почему она превышает 5-кратный объем памяти, используемой при разработке, на производстве.