Estoy usando Python 2.6.5 (32 bits) con Numpy 1.3 y Gdal 1.9.1 instalado en Windows 7 de 64 bits. Estoy tratando de leer un dataset ráster Imagine (.img) de 800 MB en una matriz Numpy para hacer algo de álgebra ráster, pero tan pronto como ejecuto el siguiente código, Python.exe se bloquea.
from osgeo import gdal
g = gdal.Open(r'path\to\dataset', gdal.GA_Readonly)
b = g.GetRasterBand(1)
data = b.ReadAsArray()
Python.exe se bloquea en la b.ReadAsArray()
llamada. Hice algunas búsquedas en Google y encontré artículos fechados en Gdal 1.6 que mencionaban este problema con Windows 7 de 64 bits, pero también mencionaron que se había solucionado en las últimas versiones de desarrollo en ese momento.
¿Alguien más ha tenido este problema? ¿Alguna solución?
ACTUALIZAR:
Decidí depurar el código en PyDev para tratar de determinar dónde está fallando. Por lo que puedo decir (todavía no recibo ningún mensaje de error) está fallando en la línea 22 de gdal_array.py.
_mod = imp.load_module('_gdal_array', fp, pathname, description)
Cuando paso a la línea de código anterior, me lleva al módulo init .py de numpy. Cuando llego al final del numpy. __ init __ .py, retrocede a la línea de código anterior. Luego, cuando presiono el botón de entrada, lo que debería llevarme a la siguiente línea dentro de gdal_array.py, el script simplemente termina sin mensajes de error ni nada.
ACTUALIZACIÓN # 2:
Desinstalé GDAL 1.9.1 e instalé GDAL 1.6.1 de Python Cheeseshop y los binarios de Windows de OSGeo. Todavía tenía el mismo problema.
fuente
Respuestas:
Como sospechan muchos comentaristas, este fue un problema con mi instalación. Aparentemente, no estaba prestando suficiente atención al instalar GDAL y los enlaces de Python.
Instalé GDAL Core y complementos (dll's) desde gisinternals.com, pero de alguna manera no pensé en instalar los enlaces de Python desde allí también. Los enlaces de Python que instalé eran de un sitio diferente (no recuerdo cuál en este momento).
Cuando reinstalé GDAL y Python Bindings, todos desde gisinternals.com, pude leer con éxito ReadAsArray.
Gracias a todos los que comentaron y respondieron y pido disculpas por mi ignorancia.
fuente
Es posible que sea un problema de memoria. Cuando usa ReadAsArray, trae los datos a la memoria, y aunque 800mb no es masivo, tampoco es pequeño. ¿Has intentado leer la matriz en trozos?
Debería poder recorrer la matriz y procesarla en trozos a la vez, aunque dependiendo del procesamiento que esté haciendo, probablemente debería buscar leer en áreas con superposición para evitar efectos de borde.
fuente
data = b.ReadAsArray(0,0, 500, 500)
con el mismo resultado.Lo siento, llego tarde a esta fiesta, pero su problema básico es que Python de 32 bits no puede almacenar rásteres muy grandes en la memoria. Puede leer su ráster grande en la memoria en trozos pequeños, pero está bastante limitado en términos de lo que puede procesar eficientemente sin lecturas / escrituras extremadamente ineficientes / frecuentes en el disco.
Lo que hago en su lugar (lo que sacrifica algo de eficiencia debido a las lecturas / escrituras del disco) es llamar (a través de un envoltorio EXE ) a la versión gisinternals.com de 64 bits de cualquier método gdal que necesite. Tenga cuidado al usar el módulo de subproceso de python en un bucle (es decir, puede querer / necesite llamar al subproceso secuencialmente ) ya que puede generar inadvertidamente demasiados hilos abiertos para su caja de ventanas y recibir advertencias ominosas del sistema. Usted sacrifica un poco en el camino para leer / escribir en el disco con este enfoque de gdal, pero su eficiencia de procesamiento solo disminuye (es decir, en relación con un cálculo rápido en memoria , si su caja / biblioteca podría soportarlo) por un factor o 10)
fuente