#django #memory-management
#django #управление памятью
Вопрос:
Я использую пользовательскую команду Django для генерации XML-карт сайта для сайта с примерно 3-4 миллионами записей данных ( ./manage.py generate_sitemaps
). Кажется, это работает, но съедает слишком много памяти, когда DEBUG
включено в settings.py.
Обычно у меня включена DEBUG
опция во время разработки, и я часто забываю отключить ее перед началом создания sitemap. Если это произойдет, память начнет заполняться до тех пор, пока скрипт не завершит работу примерно через 2-3 часа. Очень раздражает.
Есть ли способ временно отключить настройку отладки для выполнения команды Django? Я думал импортировать модуль настроек и переопределить параметр, но я не думаю, что это сработает.
Комментарии:
1. Возможен ли перезапуск вашего сервера? Если это так, вы могли бы использовать sed, чтобы установить DEBUG = Off, перезагрузить свой сервер и после этого снова включить DEBUG …
2. Это команда Django, для которой не нужен работающий сервер. Я могу изменить настройку, запустить ее и изменить обратно, но это именно то, что я слишком ленив, чтобы делать. Если бы был способ переопределить это из моего скрипта, это было бы здорово.
Ответ №1:
Я думаю, у вас здесь есть пара вариантов:
-
Импортируйте настройки и выдайте сообщение об ошибке, чтобы напомнить себе отключить отладку.
-
Используйте
--settings=
и установите это значение равным файлу (например gen_settings.py ) файл специально для вашей команды generate_sitemaps , гдеDEBUG=False
. Затем создайте псевдоним для./manage.py generate_sitemaps --settings=gen_settings
http://docs.djangoproject.com/en/dev/topics/settings / специально предупреждает, чтобы не изменять настройки во время выполнения
Я уже использовал второй вариант раньше, и он работал довольно хорошо. Лучше, чем раздражаться через 2-3 часа =)
Комментарии:
1. Интересно, относится ли предупреждение не изменять настройки во время выполнения в документах только к веб-серверам (возможно, из-за проблем с потоками и т.д.) У меня есть неподдерживаемая догадка, что это может быть менее проблематично для команд управления.
Ответ №2:
Я не совсем уверен, что это вам поможет, но вы можете попробовать:
from django.conf import settings
tmp = settings.DEBUG
settings.DEBUG = False
# some your actions
# ...
# ...
settings.DEBUG = tmp
В качестве альтернативы вы можете использовать отдельный файл настроек и установить его в командной строке следующим образом
./manage.py your_command --settings=another_settings.py
И в этом another_settings.py:
from .settings import *
DEBUG = False
Комментарии:
1. Я не думаю, что первое решение сработает, но второй подход выглядит интересным 🙂