команда django postagedb refresh_from_db приводит к ошибке памяти или .DatabaseError: не хватает памяти для результата запроса

#python #django #memory-leaks

#python #django #утечки памяти

Вопрос:

У меня есть объект влияния, который имеет много-много полей из более чем 20 тыс. подписчиков.

Я могу читать до 45 влиятельных лиц один за другим и выполнять работу с подписчиками. Это происходит не сразу, а через несколько часов.

код:

 while True:
    with ThreadPoolExecutor(max_workers=45) as executor:

        influencers = Influencer.objects.filter(
            status__in=[ProcessStatus.recorded, ProcessStatus.unfinished, ProcessStatus.in_progress]
        )

        # Process all the influencers.
        for influencer_obj in influencers:

            influencer_obj.refresh_from_db()

            # start the followers filtering process
            executor.submit(self.update, influencer_obj)
  

исключение:

     return self.cursor.execute(sql, params)
    django.db.utils.DatabaseError: out of memory for query result
  

У меня есть компьютер с 80 ГБ, на котором запущен клиент, в то время как на компьютере с почтовой базой данных не происходит утечки памяти (с использованием свободной команды).

Во-первых, где проблема с памятью, на клиенте или на сервере БД?

Во-вторых, что я могу сделать, чтобы избежать этого? должен ли я выпустить старый obj?

Ответ №1:

Я установил значение DEBUG равным FALSE. Это решило проблему, больше никаких ошибок памяти. Django при отладке сохраняет каждый запрос в базу данных, что может вызвать ошибку.

ссылка: установите DEBUG = False в вашем settings.py досье. Если DEBUG имеет значение True, то Django сохраняет копию каждого выполненного оператора SQL. См. Часто задаваемые вопросы по Django: Почему Django пропускает память? (спойлер: у Django на самом деле нет утечки памяти).

ссылка: https://travelingfrontiers.wordpress.com/2010/06/26/django-memory-error-how-to-work-with-large-databases/