Gdal Dataset.ReadAsArray () si arresta in modo anomalo in Python


12

Sto usando Python 2.6.5 (32 bit) con Numpy 1.3 e Gdal 1.9.1 installati su Windows 7 64 bit. Sto cercando di leggere un set di dati raster Imagine (.img) da 800 MB in un array Numpy per eseguire un'algebra raster, ma non appena eseguo il codice seguente, Python.exe si arresta in modo anomalo.

from osgeo import gdal

g = gdal.Open(r'path\to\dataset', gdal.GA_Readonly)
b = g.GetRasterBand(1)
data = b.ReadAsArray()

Python.exe si arresta in modo anomalo durante la b.ReadAsArray()chiamata. Ho fatto alcune ricerche su Google e ho trovato articoli risalenti a Gdal 1.6 che menzionavano questo problema con Windows 7 a 64 bit, ma hanno anche detto che era stato risolto nelle ultime versioni di sviluppo in quel momento.

Qualcun altro ha avuto questo problema? Qualche soluzione alternativa?

AGGIORNARE:

Ho deciso di eseguire il debug del codice in PyDev per cercare di determinare dove sta fallendo. Da quello che posso dire (ancora non ricevo alcun messaggio di errore) non funziona sulla riga 22 di gdal_array.py.

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

Quando passo nella riga di codice sopra, mi porta nel modulo init .py di numpy. Quando raggiungo la fine dell'intorpidimento. __ init __ .py module, torna alla riga di codice sopra. Quindi, quando premo il pulsante di passaggio, che dovrebbe portarmi alla riga successiva in gdal_array.py, lo script termina semplicemente senza messaggi di errore o altro.

AGGIORNAMENTO # 2:

Ho disinstallato GDAL 1.9.1 e installato GDAL 1.6.1 da Python Cheeseshop e dai binari di Windows di OSGeo. Aveva ancora lo stesso problema.


Ho avuto questo problema. Stai usando gli attacchi gdal python di Tamas su gis.internals? In tal caso, sposta le aggiunte al tuo PERCORSO in primo piano. Qualche altra biblioteca stava causando qualche problema per me.
Jay Laura,

Credo di aver scaricato dai suoi interni. Cercherò di adattare il mio percorso quando arrivo in ufficio domani. Grazie per il consiglio.
Brian,

1
Se ciò non funziona, di recente sono passato all'utilizzo di questi pacchetti - lfd.uci.edu/~gohlke/pythonlibs
Jay Laura,

Ho provato a spostare le cose nel mio percorso di sistema (variabile d'ambiente PATH in Windows) senza fortuna. Ho anche disinstallato la mia versione di GDAL e installato la versione di GDAL sul link che hai fornito e ho ancora avuto lo stesso problema.
Brian,

Hmmm .... la versione a cui ho collegato erano solo i binding, quindi devi ancora avere il core GDAL da Tamas. Se le altre chiamate hanno funzionato però, sta funzionando bene. Tre cose da provare sono i tiri lunghi (in ordine di "longitudine". 1) Aggiorna la tua versione di Numpy. 2) gdal_translate per gtiff e provare il codice su quell'immagine. 3) aggiungi ReadAsArray () con .astype (numpy.float32). L'immagine è pubblica? Posso provarlo sulla mia macchina. Puoi pubblicare la traccia dello stack se nessuna di queste funziona?
Jay Laura,

Risposte:


5

Come sospettato da molti commentatori, questo è stato un problema con la mia installazione. Apparentemente, non stavo prestando abbastanza attenzione durante l'installazione di GDAL e Python Bindings.

Ho installato GDAL Core e plug-in (dll's) da gisinternals.com, ma in qualche modo non ho pensato di installare anche i collegamenti Python da lì. I collegamenti Python che ho installato provenivano da un sito diverso (non ricordo quale a questo punto).

Quando ho reinstallato GDAL e Python Bindings da gisinternals.com, sono stato in grado di leggere con successo ReadAsArray.

Grazie a tutti coloro che hanno commentato e risposto e mi scuso per la mia ignoranza.


3

È possibile che sia un problema di memoria. Quando usi ReadAsArray porta i dati in memoria e, sebbene 800mb non sia massiccio, non è neanche minuscolo. Hai provato a leggere l'array in blocchi?

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

Dovresti essere in grado di eseguire il loop attraverso l'array e di elaborarlo in blocco alla volta, anche se a seconda dell'elaborazione che stai eseguendo dovresti probabilmente cercare di leggere in aree con sovrapposizione per evitare effetti di bordo.


Ho provato ad usare pezzi. Ho provato data = b.ReadAsArray(0,0, 500, 500)con lo stesso risultato.
Brian,

Hmm. Suppongo che tu abbia provato altri formati di immagine? Inoltre, c'era un messaggio di errore specifico?
om_henners,

Non ho ancora provato altri formati. non c'era nessun messaggio di errore, solo un popup che diceva "python.exe ha smesso di funzionare".
Brian,

Ho convertito il file .img in un GeoTIFF questa mattina e ho riprovato. Senza fortuna.
Brian,

C'è un modo per mappare la memoria del file da gdal?
CMCDragonkai

1

Mi dispiace, sono in ritardo per questa festa, ma il tuo problema di base è che Python a 32 bit non è in grado di memorizzare raster molto grandi in memoria. Puoi leggere il tuo raster di grandi dimensioni in memoria in blocchi di dimensioni ridotte, ma sei abbastanza limitato in termini di cosa puoi elaborare in modo efficiente senza letture / scritture su disco estremamente inefficienti / frequenti.

Quello che faccio invece (che sacrifica un po 'di efficienza a causa della lettura / scrittura del disco) è chiamare ( tramite wrapping EXE ) la versione gisinternals.com a 64 bit di qualunque metodo gdal sia necessario. Fai attenzione a utilizzare il modulo di sottoprocesso di Python in un ciclo (cioè potresti voler / dover chiamare il sottoprocesso in sequenza ) poiché potresti inavvertitamente generare troppi thread aperti per la tua finestra di Windows e ricevere minacciosi avvisi di sistema. Ti sacrifichi un po 'nel modo di leggere / scrivere su disco con questo approccio gdal, ma la tua efficienza di elaborazione diminuisce (cioè relativamente a un calcolo in memoria velocissimo , se il tuo box / libreria potrebbe supportarlo) di circa un fattore o 10.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.