Gdal Dataset.ReadAsArray () bloquea Python

12

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.

Brian
fuente
Yo estaba teniendo este problema. ¿Está utilizando los enlaces gdal python de Tamas en gis.internals? Si es así, mueva sus adiciones a su RUTA al frente. Alguna otra biblioteca me estaba causando algún problema.
Jay Laura
Creo que lo descargué de sus partes internas. Intentaré ajustar mi camino cuando llegue a la oficina mañana. Gracias por el consejo.
Brian
1
Si eso no funciona, recientemente cambié
Jay Laura
Intenté mover cosas en mi ruta del sistema (variable de entorno PATH en Windows) sin suerte. También desinstalé mi versión de GDAL e instalé la versión de GDAL en el enlace que proporcionó y todavía tenía el mismo problema.
Brian
Hmmm ... la versión a la que me vinculé fue solo los enlaces, por lo que aún necesita tener el núcleo GDAL de Tamas. Sin embargo, si las otras llamadas funcionaron, eso está funcionando bien. Hay tres cosas para probar que son tiros largos (en orden de 'longitud'. 1) Actualice su versión de Numpy. 2) gdal_translate a gtiff e intente el código en esa imagen. 3) agregue ReadAsArray () con .astype (numpy.float32). ¿Es pública la imagen? Puedo probarlo en mi máquina. ¿Puedes publicar el seguimiento de la pila si ninguno de esos funciona?
Jay Laura

Respuestas:

5

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.

Brian
fuente
3

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?

data = b.ReadAsArray(x_offset, y_offset, x_size, y_size)

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.

om_henners
fuente
Intenté usar trozos. Lo intenté data = b.ReadAsArray(0,0, 500, 500)con el mismo resultado.
Brian
Hmm ¿Supongo que has probado otros formatos de imagen? Además, ¿hubo un mensaje de error específico?
om_henners
No he probado ningún otro formato todavía. no había ningún mensaje de error, solo una ventana emergente que decía "python.exe ha dejado de funcionar".
Brian
Convertí el archivo .img a un GeoTIFF esta mañana e intenté nuevamente. Sin suerte.
Brian
¿Hay alguna manera de mapear el archivo desde gdal?
CMCDragonkai
1

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)

ksed
fuente