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.
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.