2008-08-29 30 views
143

¿Qué le parece averiguar cuánta memoria está utilizando un objeto? Sé que es posible averiguar cuánto se usa por un bloque de código, pero no por un objeto instanciado (en cualquier momento de su vida), que es lo que quiero.Averiguar cuánta memoria está usando un objeto en Python

+0

Similar: http://stackoverflow.com/questions/449560/how-do-i-determine-the-size-of-an-object-in-python –

+0

objgraph se ve muy interesante: http: //mg.pov .lt/objgraph/ –

+0

gráfica de prueba: http://stackoverflow.com/a/30008338/2087463 – tmthydvnprt

Respuesta

81

No hay una manera fácil de encontrar el tamaño de la memoria de un objeto python. Uno de los problemas que puede encontrar es que los objetos de Python, como las listas y los dictados, pueden tener referencias a otros objetos de Python (en este caso, ¿cuál sería su tamaño? ¿El tamaño que contiene el tamaño de cada objeto o no?). Existen algunos indicadores generales y estructuras internas relacionadas con los tipos de objetos y la recolección de basura. Finalmente, algunos objetos Python tienen comportamientos no obvios. Por ejemplo, enumera el espacio de reserva para más objetos de los que tienen, la mayoría de las veces; Los dicts son incluso más complicados ya que pueden operar de diferentes maneras (tienen una implementación diferente para un número pequeño de claves y, a veces, asignan más de las entradas).

Hay un big chunk of code (y un updated big chunk of code) para tratar de aproximar mejor el tamaño de un objeto python en la memoria. También hay algunos simpler approximations. Pero siempre serán aproximaciones.

También es posible que desee comprobar algunos old description about PyObject (la estructura C interna que representa prácticamente todos los objetos python).

+6

@culix: Parece que de nuevo ahora se utiliza en el [Pympler] (http://pythonhosted.org/Pympler/) módulo. – FriendFX

+0

"aproximaciones más simples" vínculo se rompe - ¿tenía intención de vincular a [este mensaje] (https://mail.python.org/pipermail/python-list/2008-January/510696.html)? – Air

+0

Qué pasa si su objeto es bastante simple, como un diccionario con un 'Int -> (Int, Int)' mapeo? En teoría, calcular el tamaño de tal objeto debería ser simple, ¿no? –

4

No tengo ninguna experiencia personal con cualquiera de los siguientes, pero una simple búsqueda de un "Python [Memoria] perfilador" rendimiento:

  • PySizer "un perfilador de memoria para Python," que se encuentra en http://pysizer.8325.org/. Sin embargo, la página parece indicar que el proyecto no se ha actualizado durante un tiempo, y se refiere a ...

  • Heapy, "soporte [ing] depuración y optimización con respecto a problemas relacionados con la memoria en programas Python", que se encuentra en http://guppy-pe.sourceforge.net/#Heapy.

Espero que ayude.

23

Otro enfoque es usar pickle. Ver this answer a un duplicado de esta pregunta.

+3

Es un enfoque extremadamente sensato * y *. –

+0

estoy realmente interesado por su respuesta, pero no se puede acceder al enlace que sus puntos de respuesta a ... –

+0

@YohanObadia Acabo de intentar el enlace y funcionó ... Es otra Así que la respuesta. – drevicko

63

Prueba esto:

sys.getsizeof(object) 

getsizeof() llama el método del objeto __sizeof__ y añade una sobrecarga recolector de basura adicional si el objeto es administrado por el recolector de basura.

A recursive recipe

+2

hace esto sys.getsizeof valor (objeto) de retorno incluye el tamaño del objeto real en lugar del tamaño de su puntero como se ha dicho anteriormente fserb? –

+2

No, devolverá el tamaño del puntero. – lstyls

2

Esta debe ser utilizado con cuidado debido a una anulación de los objetos __sizeof__ podría inducir a error.

Al usar bregman.suite, algunas pruebas con sys.getsizeof dan como resultado una copia de un objeto de matriz (datos) en una instancia de objeto que es más grande que el objeto mismo (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> 
-2

Para objetos grandes que usted puede usar un método algo tosco pero eficaz: verificación de la cantidad de memoria su proceso de Python ocupa en el sistema, a continuación, eliminar el objeto y comparar.

Este método tiene muchas desventajas, pero le dará una estimación muy rápida para objetos muy grandes.

+3

Es poco probable que esto sea efectivo. La memoria liberada en un proceso no tiene que devolverse al sistema operativo, por lo que buscar una disminución en el uso de la memoria puede no ser precisa. –

+7

Un enfoque similar de medir el uso de recursos de proceso de Python antes de que se cree y después el objeto sería bastante efectivo. –

+1

No crea que @AntonyHatchkins como administrador de memoria python no obtenga necesariamente memoria nueva de los sistemas operativos. Hasta cierto punto, el grupo de memoria se mantiene asignado incluso si no está en uso, de modo que cuando hay una nueva solicitud, se puede cumplir sin la necesidad de solicitar más memoria del sistema operativo. En otras palabras, este enfoque no es confiable tanto para la creación como para la destrucción de objetos. – spider

Cuestiones relacionadas