13 votos

GDAL Dataset.ReadAsArray() accidentes de Python

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 800 MB Imaginar (.img) dataset ráster en una Colección de la matriz a hacer algo de trama de álgebra, pero tan pronto como se ejecute el código siguiente, 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 encontrar los artículos con fecha de Gdal 1.6 que menciona este problema con Windows 7 de 64 bits, pero también mencionó que ha sido corregido en las últimas versiones de desarrollo en ese momento.

Ha alguien tuvo este problema? Las soluciones?

ACTUALIZACIÓN:

Me decidí a depurar el código en PyDev para tratar de determinar dónde se está fallando. Por lo que puedo decir (aún no recibir ningún mensaje de error) que está fallando en la línea 22 de la gdal_array.py.

_mod = imp.load_module('_gdal_array', fp, pathname, description)

Cuando me paso en la línea de código anterior, me lleva en el init.py módulo de numpy. Cuando llego al final de la numpy.__init__.py módulo, que sale de nuevo a la línea de código anterior. Luego, cuando llego al paso en el botón, que debería llevarme a la siguiente línea dentro de gdal_array.py el script solo termina con ningún mensaje de error ni nada.

ACTUALIZACIÓN #2:

He desinstalado GDAL 1.9.1 e instalado GDAL 1.6.1 desde el Python Cheeseshop y de OSGeo binario de Windows. Aún tenía el mismo problema.

5voto

user2923 Puntos 21

Como se sospecha por muchos comentaristas, este era un problema con mi instalación. Al parecer, yo no estaba prestando suficiente atención al instalar GDAL y los Enlaces Python.

He instalado GDAL Núcleo y complementos (dll) de gisinternals.com pero de alguna manera yo no creo que para instalar el Python Bindings partir de ahí. Los Enlaces Python he instalado eran de un sitio diferente (no recuerdo cual en este momento).

Cuando he vuelto a instalar GDAL y Enlaces Python todos los de gisinternals.com, yo era capaz de ReadAsArray.

Gracias a todos los que comentaron y respondió, y me disculpo por mi ignorancia.

3voto

ESV Puntos 4591

Es posible que sea un problema de memoria. Cuando se utiliza ReadAsArray trae los datos en la memoria, y mientras que 800mb no es masivo, no es pequeño tampoco. ¿Ha intentado leer la matriz en trozos?

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

Podrá recorrer el array y proceso pedazo a la vez, aunque según el tratamiento que estás haciendo probablemente debe buscar lectura en zonas de solape para evitar efectos de borde.

1voto

ksed Puntos 28

Lo siento, llego tarde a este partido, pero su problema básico es que las de 32 bits de Python no puede almacenar una gran cantidad de rásteres en la memoria. Usted puede leer su gran trama en la memoria en trozos tamaño bocado, pero entonces usted está bastante limitado en términos de lo que se puede procesar de manera eficiente, sin extremadamente ineficiente/frecuentes de lectura/escritura en disco.

Lo que hago en lugar de (que sacrifica algo de eficiencia debido a la disco lee/escribe) es llamar (a través de EXE-envoltura) de 64 bits gisinternals.com la versión de lo que gdal método que usted necesita. Tener cuidado con el uso de python módulo subprocess en un bucle (es decir, puede que quiera/necesite llamar subproceso de forma secuencial) como sin darse cuenta puede generar demasiados hilos para su caja de windows y obtener ominosas advertencias del sistema. Sacrificar un poco en la forma de disco de lectura/escritura con este gdal enfoque, pero su eficiencia de procesamiento de baja (es decir, en relación a un aligeramiento rápido en la memoria de cálculo, si tu caja/biblioteca podría apoyar a) por un factor de 10.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X