2010-11-04 19 views
10

Tengo una gran serie de datasets ráster que representan precipitaciones mensuales durante varias décadas. He escrito un script en Python que se repite sobre cada trama y hace lo siguiente:¿Cómo recorro un gran conjunto de datos en python sin obtener un MemoryError?

  1. Convierte la trama a una matriz numpy enmascarado,
  2. Realiza un montón de variedad de álgebra para calcular un nuevo nivel de agua,
  3. Escribe el resultado en un ráster de salida.
  4. Repite

El guión es sólo una larga lista de ecuaciones de álgebra de matriz cerrados por una sentencia de bucle.

Todo funciona bien si solo ejecuto el script en una pequeña parte de mis datos (digamos 20 años), pero si trato de procesar todo, obtengo un MemoryError. El error no proporciona más información que esa (excepto que resalta la línea del código en el que Python se dio por vencido).

Desafortunadamente, no puedo procesar fácilmente mis datos en pedazos, realmente necesito poder hacer todo al mismo tiempo. Esto se debe a que, al final de cada iteración, la salida (nivel de agua) vuelve a la siguiente iteración como punto de inicio.

Mi comprensión de la programación es muy básica en la actualidad, pero pensé que todos mis objetos se sobrescribirían en cada ciclo. Yo (¿estúpidamente?) Supuse que si el código lograba hacer bucles con éxito una vez, entonces debería poder repetir indefinidamente sin consumir más y más memoria.

He intentado leer varios documentos y he descubierto algo llamado "Recolector de basura", pero siento que estoy saliendo de mi profundidad y de que mi cerebro se está derritiendo. ¿Alguien puede ofrecer una idea básica de lo que realmente sucede con los objetos en la memoria cuando mi código se repite? ¿Hay alguna manera de liberar memoria al final de cada bucle, o hay alguna forma de codificación más "pitónica" que evita por completo este problema?

+1

No creo que las personas puedan ayudarlo demasiado sin ver algún código fuente. – GWW

Respuesta

4

una forma rápida de "forzar" el recolector de basura para limpiar el bucle sólo temporal objetos es el del enunciado:

for obj in list_of_obj: 
    data = obj.getData() 
    do_stuff(data) 
    del data 

Esto obliga al intérprete para eliminar y liberar a los objetos temporales. NOTA: esto no garantiza que el programa no tenga fugas ni consuma memoria en otras partes del cálculo, solo es una comprobación rápida

5

No necesita preocuparse por la administración de la memoria, especialmente no con el recolector de basura que tiene una tarea muy específica que probablemente ni siquiera uses. Python siempre recolectará la memoria que pueda y la reutilizará.

Existen dos razones para su problema: o bien los datos que intenta cargar son demasiado para caber en la memoria o sus cálculos almacenan datos en algún lugar (una lista, dict, algo persistente entre iteraciones) y ese almacenamiento crece y crece . Memory profilers can help buscando eso.

Cuestiones relacionadas