Quero saber o uso de memória do meu aplicativo Python e quero especificamente saber quais blocos / partes de código ou objetos estão consumindo mais memória. A pesquisa do Google mostra que uma comercial é o Python Memory Validator (somente Windows).
E os de código aberto são PySizer e Heapy .
Eu não tentei ninguém, então eu queria saber qual é o melhor, considerando:
Dá mais detalhes.
Eu tenho que fazer poucas ou nenhuma alteração no meu código.
python
performance
memory-management
profiling
Anurag Uniyal
fonte
fonte
Respostas:
Heapy é bastante simples de usar. Em algum momento do seu código, você deve escrever o seguinte:
Isso fornece uma saída como esta:
Você também pode descobrir de onde os objetos são referenciados e obter estatísticas sobre isso, mas de alguma forma os documentos são um pouco esparsos.
Também existe um navegador gráfico, escrito em Tk.
fonte
pip install https://guppy-pe.svn.sourceforge.net/svnroot/guppy-pe/trunk/guppy
boost::python
objetos, seria bom ver alguns exemplos!Como ninguém o mencionou, aponto para o meu módulo memory_profiler, que é capaz de imprimir relatórios linha a linha do uso de memória e funciona no Unix e no Windows (precisa de psutil neste último). A saída não é muito detalhada, mas o objetivo é fornecer uma visão geral de onde o código está consumindo mais memória e não uma análise exaustiva dos objetos alocados.
Depois de decorar sua função
@profile
e executar seu código com o-m memory_profiler
sinalizador, ele imprimirá um relatório linha por linha como este:fonte
memory_profiler
Buffer sua saída? Posso estar fazendo algo errado, mas parece que, em vez de despejar o perfil de uma função quando ela é concluída, aguarda o término do script.Eu recomendo Dowser . É muito fácil de configurar e você precisa de zero alterações no seu código. Você pode visualizar a contagem de objetos de cada tipo ao longo do tempo, visualizar a lista de objetos ativos, ver referências a objetos ativos, tudo a partir da interface da web simples.
Você importa o memdebug e chama o memdebug.start. Isso é tudo.
Eu não tentei o PySizer ou o Heapy. Eu apreciaria as opiniões dos outros.
ATUALIZAR
O código acima é para
CherryPy 2.X
,CherryPy 3.X
oserver.quickstart
método foi removido eengine.start
não recebe oblocking
sinalizador. Então, se você estiver usandoCherryPy 3.X
fonte
Considere o objetivo biblioteca (consultehttp://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks para um exemplo de caso de uso).
fonte
objgraph.by_type('dict')
entender de ondedict
vêm todos esses objetos inesperados .Muppy é (mais um) Profiler de uso de memória para Python. O foco deste conjunto de ferramentas é colocado na identificação de vazamentos de memória.
Muppy tenta ajudar os desenvolvedores a identificar vazamentos de memória de aplicativos Python. Permite o rastreamento do uso da memória durante o tempo de execução e a identificação de objetos que estão vazando. Além disso, são fornecidas ferramentas que permitem localizar a origem dos objetos não liberados.
fonte
Estou desenvolvendo um criador de perfil de memória para Python chamado memprof:
http://jmdana.github.io/memprof/
Permite registrar e plotar o uso de memória de suas variáveis durante a execução dos métodos decorados. Você apenas precisa importar a biblioteca usando:
E decore seu método usando:
Este é um exemplo de como os gráficos se parecem:
O projeto está hospedado no GitHub:
https://github.com/jmdana/memprof
fonte
a
,b
ec
são os nomes das variáveis. Você pode encontrar a documentação em github.com/jmdana/memprof . Se você tiver alguma dúvida, sinta-se à vontade para enviar um problema no github ou enviar um email para a lista de discussão que pode ser encontrada na documentação.Eu achei as melias muito mais funcionais que o Heapy ou o PySizer. Se você estiver executando um aplicativo Web wsgi, o Dozer é um bom pacote de middleware da Dowser
fonte
Experimente também o projeto pytracemalloc que fornece o uso da memória por número de linha do Python.
EDIT (2014/04): Agora ele possui uma interface gráfica Qt para analisar snapshots.
fonte
tracemalloc
agora faz parte da biblioteca padrão do python. Veja docs.python.org/3/library/tracemalloc.html