2010-10-04 8 views
7

Tengo un proceso de Python de larga duración que está generando más datos de los que había planeado. Mis resultados se almacenan en una lista que se serializará (en escabeche) y se escribirá en el disco cuando el programa finalice, si es que llega tan lejos. Pero a este ritmo, es más probable que la lista agote todos los RAM libres de 1+ GB y el proceso se bloqueará, perdiendo todos mis resultados en el proceso.¿Cómo acceder a una estructura de datos desde un proceso de Python actualmente en ejecución en Linux?

Planeo modificar mi script para escribir resultados en el disco periódicamente, pero me gustaría guardar los resultados del proceso que se está ejecutando actualmente si es posible. ¿Hay alguna forma de que pueda tomar una estructura de datos en memoria de un proceso en ejecución y escribirla en el disco?

Encontré code.interact(), pero como ya no tengo este enganche en mi código, no me parece útil (Method to peek at a Python program running right now).

Estoy ejecutando Python 2.5 en Fedora 8. ¿Alguna idea?

Muchas gracias.

Shahin

+0

¿Qué esperas hacer con la 'estructura de datos del proceso actual'? Si lo guardas y lo vuelves a cargar, ¿no estarás tan fuera de memoria como lo estás para empezar? –

+1

En este caso particular, lo transferiré a otra máquina (con más memoria) para deserializarlo y, o bien, volver a escribirlo de forma gradual o cargarlo directamente en una base de datos. Obviamente no es sostenible, pero solo estoy buscando una solución provisional de una sola vez aquí. – Shahin

Respuesta

3

No hay mucho que puede hacer por un programa en ejecución. Lo único que se me ocurre es adjuntar el depurador gdb, detener el proceso y examinar la memoria. De forma alternativa, asegúrese de que su sistema esté configurado para guardar volcados del núcleo y luego elimine el proceso con kill --sigsegv <pid>. Debería poder abrir el volcado del núcleo con gdb y examinarlo cuando lo desee.

Existen algunas macros gdb que le permitirán examinar estructuras de datos python y ejecutar código python desde dentro de gdb, pero para que funcionen necesita tener Python compilado con símbolos de depuración habilitados y dudo que ese sea su caso. La creación de un volcado de núcleo primero y la recompilación de Python con símbolos NO funcionará, ya que todas las direcciones habrán cambiado de los valores en el volcado.

Éstos son algunos enlaces para la introspección de Python desde GDB:

http://wiki.python.org/moin/DebuggingWithGdb

http://chrismiles.livejournal.com/20226.html

o google para 'pitón BGF

N. B. para configurar linux para crear coredumps use el comando ulimit.

ulimit -a le mostrará los límites actuales establecidos.

ulimit -c unlimited habilitará los volcados de núcleo de cualquier tamaño.

+0

Lástima. Esto suena útil en general, sin embargo, así que le daré una oportunidad. Gracias por la respuesta detallada. – Shahin

0

+1 Pregunta muy interesante.

No sé qué tan bien esto podría funcionar para usted (especialmente porque no sé si volverá a utilizar la lista de escarabajos en el programa), pero sugeriría esto: al escribir en el disco, imprima fuera de la lista a STDOUT. Cuando se ejecuta el script en Python (supongo que también de línea de comandos), redirigir la salida a anexar a un archivo de este modo:

python myScript.py >> logFile. 

Esto debería almacenar todas las listas en el archivo de registro. De esta manera, siempre puede ver lo que hay en logFile y debe tener las estructuras de datos más actualizadas allí (dependiendo de dónde llame imprimir).

Esperanza esto ayuda

1

Aunque ciertamente no es muy bonito, puede intentar acceder a los datos de su proceso a través del sistema de archivos proc ../proc/[pid-of-your-process]. El sistema de archivos proc almacena una gran cantidad de información por proceso, como punteros de archivos actualmente abiertos, mapas de memoria y lo que no. Sin embargo, con un poco de excavación, es posible que pueda acceder a los datos que necesita.

Todavía sospecho que deberías mirar esto desde dentro de python y hacer algo de tiempo de ejecución & depurando.

0

This answer tiene información sobre cómo adjuntar gdb a un proceso de python, con macros que lo llevarán a una sesión pdb en ese proceso. No lo he probado, pero obtuvo 20 votos. Parece que podrías terminar colgando la aplicación, pero también parece que vale la pena el riesgo en tu caso.

Cuestiones relacionadas