Pergunta

Esta pergunta já tem uma resposta aqui:

Como você faria para descobrir o quanto de memória está sendo usado por um objeto?Eu sei que é possível descobrir o quanto é usado por um bloco de código, mas não por um objeto instanciado a qualquer momento durante a sua vida), que é o que eu quero.

Foi útil?

Solução

Não há nenhuma maneira fácil para descobrir o tamanho da memória de um objeto python.Um dos problemas que você pode encontrar é que o Python objectos - como listas e dicts - podem ter referências para outros objetos python (neste caso, qual seria o tamanho?O tamanho, contendo o tamanho de cada objeto ou não?).Existem algumas indicações de sobrecarga e de estruturas internas relacionadas a tipos de objeto e coleta de lixo.Finalmente, alguns python objetos não-óbvia de comportamentos.Por exemplo, listas de reservar espaço para mais objetos do que eles têm, na maioria das vezes;dicts são ainda mais complicado, uma vez que podem operar de diferentes maneiras (eles têm uma implementação diferente para o pequeno número de chaves e, por vezes, mais de alocar entradas).

Há um grande parte do código (e uma atualizado grande pedaço de código) lá fora para tentar melhor o tamanho aproximado de um objeto python na memória.

Você também pode querer verificar para alguns descrição velha sobre PyObject (o interno C struct que representa praticamente todos os objetos python).

Outras dicas

Tente isso:

sys.getsizeof(object)

getsizeof() chama o objeto do __sizeof__ método e adiciona um coletor de lixo sobrecarga se o objeto é gerido pelo coletor de lixo.

Um recursiva receita

Outra abordagem é o uso de picles.Ver esta resposta um duplicado desta questão.

Eu não tenho qualquer experiência pessoal com qualquer um dos seguintes, mas uma pesquisa simples, para um "Python [memória] profiler" rendimento:

  • PySizer, "memória de um profiler para Python", que se encontra no http://pysizer.8325.org/.No entanto, a página parece indicar que o projeto ainda não foi atualizado por um tempo, e refere-se a...

  • Heapy, "apoio[ing] depuração e otimização em relação a memória problemas relacionados a programas Python", que se encontra no http://guppy-pe.sourceforge.net/#Heapy.

Espero que ajude.

Este deve ser usado com cuidado, porque uma substituição nos objetos __sizeof__ pode ser enganosa.

Usando o bregman.suite, alguns testes com o sys.getsizeof saída de uma cópia de um objeto de matriz (dados) em uma instância do objeto como sendo maior do que o objeto em si (mfcc).

>>> mfcc = MelFrequencyCepstrum(filepath, params)
>>> data = mfcc.X[:]
>>> sys.getsizeof(mfcc)
64
>>> sys.getsizeof(mfcc.X)
>>>80
>>> sys.getsizeof(data)
80
>>> mfcc
<bregman.features.MelFrequencyCepstrum object at 0x104ad3e90>

Para grandes objetos que você pode usar um pouco bruto, mas eficaz método:verifique a quantidade de memória do Python processo ocupa no sistema e, em seguida, excluir o objeto e comparar.

Este método tem muitas desvantagens, mas ele vai dar a você um muito rápido estimativa muito grande de objetos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top