2009-11-05 18 views
10

Tengo un programa de Python que muere con un MemoryError cuando le doy un archivo grande. ¿Hay alguna herramienta que pueda usar para descubrir qué está usando la memoria?Cómo depurar un MemoryError en Python? Herramientas para el uso de la memoria de seguimiento?

Este programa funcionó bien en archivos de entrada más pequeños. El programa obviamente necesita algunas mejoras de escalabilidad; Solo estoy tratando de averiguar dónde. "Punto de referencia antes de optimizar", como dijo una vez una persona sabia.

(Solo para evitar la inevitable respuesta "agregar más RAM": se ejecuta en un WinXP box de 32 bits con 4 GB de RAM, por lo que Python tiene acceso a 2 GB de memoria utilizable. Agregar técnicamente no es posible. mi PC con Windows de 64 bits no es práctico)

EDIT:. Vaya, esto es un duplicado de Which Python memory profiler is recommended?

Respuesta

9

Heapy es un perfilador de memoria para Python, que es el tipo de herramienta que necesita.

+1

BTW duplicado de este: http://stackoverflow.com/questions/110259/python-memory-profiler – Wim

3

La manera más simple y liviana sería usar el built in memory query capabilities de Python, como sys.getsizeof - simplemente ejecútelo en sus objetos para un problema reducido (es decir, un archivo más pequeño) y vea lo que requiere mucha memoria.

+3

Buena y rápida solución. Sin embargo, algunas limitaciones, ya que necesita saber qué objeto es (o tener una suposición educada). Además, hacer esto en una lista con 100 objetos de 100 MB cada uno devolverá el tamaño de 100 punteros (por lo que solo unos pocos KB) ... – Wim

2

En su caso, la respuesta es probablemente muy simple: no lea todo el archivo de una vez, pero procese el fragmento de archivo por partes. Eso puede ser muy fácil o complicado según su escenario de uso. Solo por ejemplo, un cómputo de suma de comprobación MD5 se puede hacer mucho más eficientemente para archivos grandes sin leer todo el archivo. El último cambio redujo drásticamente el consumo de memoria en algunos escenarios de uso de SCons pero era casi imposible de rastrear con un generador de perfiles de memoria.

Si aún necesita un generador de perfiles de memoria: eliben ya sugirió sys.getsizeof. Si eso no funciona, prueba Heapy o Pympler.

1

le pidió una recomendación herramienta:

Python memoria Validador le permite supervisar el uso de memoria, asignación de ubicaciones, colecciones de GC, instancias de objetos, las instantáneas de memoria, etc de su aplicación Python. Solo Windows

http://www.softwareverify.com/python/memory/index.html

responsabilidad: yo estaba involucrado en la creación de este software.

+3

¿Por qué solo Windows? Debes darte cuenta de que es una pequeña minoría de desarrolladores de Python. – Will

Cuestiones relacionadas