ORMs, embora simplifiquem a manipulação de dados, podem ter custos significativos, como o erro de OOM (Out Of Memory) que ocorreu neste caso. O problema se manifestou durante a etapa de recorte de dados de produção, onde uma porcentagem de registros era removida usando o método.delete() em um queryset.

Como um único .delete() do Django estourou a memória de uma instância de 4 GB | Recortando Dados de Produção

Contexto do Problema

O contexto envolveu a transformação de um pipeline que gerava um recorte de dados de produção. Decidimos usar um Django command para criar o recorte, optando por deletar os registros que não atendiam aos requisitos específicos. O uso do método.delete() foi a causa do erro de OOM.

Detalhes do Problema

O método.delete() envolve uma cascata de regras CASCADE, o que resultou em uma coleta de objetos relacionados em memória. A função do Collector é coletar todos os objetos relacionados antes de deletar, o que resultou em uso exagerado da memória.

Solução

Para resolver o problema, optamos por deletar os registros em lotes, em vez de usar o método.delete() em um queryset gigante. Isso mantém o uso de memória constante, evitando o erro de OOM.

Conclusão

O uso excessivo do método.delete() em Django pode levar a erros de OOM, especialmente em contextos de grande escala e volume de dados. A solução envolve a utilização de lotes para gerenciar o uso de memória, garantindo a eficiência e a escalabilidade do sistema.

DeleteDjangoEstourouMemoriaRecortando