Consumo de memória em processos longos no Django

Há pouco tempo criei um script para importação offline de XML no Django.

O tamanho dos arquivos era próximo a 100Mb, pelas minhas contas são mais de 60 mil registros, argh.

Durante os testes, reparei que o processo crescia absurdamente e achei bom dar uma revisada antes de colocar em produção.

Tentei me entender com o módulo gc (Garbage Collector) mas não deu muito certo, encerrou o expediente e fui pra casa sem resolver o problema.

Mas nada como o ócio criativo para nos trazer idéias espontâneas. Pensei:

O que estou fazendo que pode estar estourando a memória?
Para cada item, verifico se existe, se existir atualizo, senão eu crio, são pelo menos duas consultas pra isso, mais as chaves estrangeiras, …..
Ei, isso tudo vai para o log de consultas do Django!! Diacho.

Pronto, achei o culpado! Em modo de debug, o Django mantém um histórico de todas as consultas feitas ao banco, então os 100Mb do XML vão facilmente virando 200Mb, 300Mb, o meu limite de paciência foi quando o processo chegou aos 400Mb.

Estes logs são mantidos no django.db.connection.queries, aqui vai um exemplo para testar:

from django.db import connection
print connection.queries

Para provar o meu ponto, fiz o teste mais tosco, a cada item processado limpava a lista de consultas. O processo crescia, mas muito pouco, nada que fosse crítico.

from django.db import connection
connection.queries = []

Por fim, fiz outro teste, com o debug desligado, e o processo também se manteve enxuto, sem limpar o log de consultas.

Probleminha chato, que demorou pra ser encontrado. Quando eu ia pensar em desligar o debug pra testar alguma coisa? Geralmente é o contrário: teste + debug / produção – debug.

Então fica a dica, quando estiver trabalhando com processos pesados ou de longa duração, é aconselhável desligar o modo de debug, principalmente se é algo que roda offline, agendado no cron ou longe dos “olhos dos usuários”.

Sobre Rico
Software engineer

6 Responses to Consumo de memória em processos longos no Django

  1. Valeu Enrico!

    Esse tipo de dica economiza algum remédio pra dor de cabeça e algumas horas de sono!

    Show de bola!

  2. Como vejo esses logs do django?

    • Rico disse:

      Olá Valdinei, atualizei o post para mostrar onde vão os logs, mas ficam no objeto de conexão ao banco:

      from django.db import connection
      print connection.queries
  3. Elton disse:

    Rapaz você me tirou um problemão das mãos. Estou importando uns arquivos com milhares de linhas e já estava ficando preocupado pois o processo já estava “comendo” mais de 400MB de memória, depois de ler sua dica, configurei minha aplicação e agora está consumindo somente 9,5MB.

    Valeu pela dica!

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: