O Python tem um garbage collector, mas não é tão bom quanto o Java, então em algumas aplicações para rodar initerruptamente é importante monitorar o estado da memória do programa e apagar da memória variáveis e objetos não utilizados.
Visualizando a memória utilizada pelo seu programa no Python
Usando o resource
Se o Python rodar em Linux, basta usar a biblioteca resource:
import resource <span class="pln">resource</span><span class="pun">.</span><span class="pln">getrusage</span><span class="pun">(</span><span class="pln">resource</span><span class="pun">.</span><span class="pln">RUSAGE_SELF</span><span class="pun">).</span><span class="pln">ru_maxrss</span>
Usando o memory_profiler
Mostra o uso da memória em tempo real no console
https://www.dev2qa.com/python-profile-memory-usage-and-object-graph-example/
Usando o objgraph
Cria um grafo das relações entre os objetos no programa.
https://www.dev2qa.com/python-profile-memory-usage-and-object-graph-example/
Outras dicas para otimizar memória
https://dzone.com/articles/python-memory-issues-tips-and-tricks
Forçando Python a limpar a memória
Chamando o garbage collector
gc.collect
Marcando variáveis e objetos para serem deletados pelo garbage collector
chamar o del:
Dando override no método __del__
implementando seu próprio __del__
Resposta interessante sobre como limpar a memória
https://stackoverflow.com/a/38545526/2789895