Простой запрос вызывает утечку памяти в Django - PullRequest
2 голосов
/ 04 апреля 2019

Я работаю в компании, у которой есть большая база данных, и я хочу выполнить некоторые запросы на обновление, но, похоже, это вызывает огромную утечку памяти, запрос выглядит следующим образом:

c= CallLog.objects.all()
for i in c:
   i.cdate = pytz.utc.localize(datetime.datetime.strptime(i.fixed_date, "%y-%m-%d %H:%M"))
   i.save()

я написал это винтерактивная оболочка django

Я даже пытался использовать

with transaction.atomic()

, но она не сработала, у вас есть идеи, как я могу обнаружить источник

набор данных, над которым я работаю, составляет около 27 млн.

fixed_date - это вычисляемое свойство

Ответы [ 3 ]

0 голосов
/ 04 апреля 2019

Вы можете попробовать повторить набор запросов в пакетном режиме;см. метод .iterator().Посмотрите, улучшится ли это что-нибудь

for obj in CallLog.objects.all():
    obj.cdate = pytz.utc.localize(
        datetime.datetime.strptime(obj.fixed_date, "%y-%m-%d %H:%M"))
    obj.save()

Вот соответствующий ответ Я нашел, но ему несколько лет.

0 голосов
/ 04 апреля 2019

Попробуйте разбить его на маленькие блоки (так как у вас есть только 4 ГБ оперативной памяти)

c= CallLog.objects.filter(somefield=somevalue)

Когда это необходимо, я обычно использую символ или цифру (идентификационный номер 1,2,3,4 и т. Д.)

0 голосов
/ 04 апреля 2019

Вы можете попробовать что-то вроде этого:

from django.core.paginator import Paginator

p = Paginator(CallLog.objects.all().only('cdate'), 2000)
for page in range(1, p.num_pages + 1):
    for i in p.page(page).object_list:
        i.cdate = pytz.utc.localize(datetime.datetime.strptime(i.fixed_date, "%y-%m-%d %H:%M"))
        i.save()

Нарезка набора запросов не загружает все объекты в памяти только для получения подмножества, но добавляет ограничение и смещение к запросу SQL перед попаданием в базу данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...