Estou usando o Python 2.6.5 (32 bits) com o Numpy 1.3 e o Gdal 1.9.1 instalados no Windows 7 de 64 bits. Estou tentando ler um conjunto de dados de varredura Imagine de 800 MB Imagine (.img) em uma matriz Numpy para fazer uma álgebra de varredura, mas assim que executo o código a seguir, o Python.exe falha.
from osgeo import gdal
g = gdal.Open(r'path\to\dataset', gdal.GA_Readonly)
b = g.GetRasterBand(1)
data = b.ReadAsArray()
Python.exe trava na b.ReadAsArray()
chamada. Pesquisei no Google e encontrei artigos datados do Gdal 1.6 que mencionavam esse problema no Windows 7 de 64 bits, mas também mencionaram que ele havia sido corrigido nas últimas versões de desenvolvimento da época.
Alguém mais teve esse problema? Alguma solução alternativa?
ATUALIZAR:
Decidi depurar o código no PyDev para tentar determinar onde está falhando. Pelo que sei (ainda não recebi nenhuma mensagem de erro), está falhando na linha 22 do gdal_array.py.
_mod = imp.load_module('_gdal_array', fp, pathname, description)
Quando entro na linha de código acima, ele me leva ao módulo init .py do numpy. Quando chego ao final do entorpecido. __ init __ .py, ele retorna à linha de código acima. Então, quando clico no botão step into, o que deve me levar à próxima linha do arquivo gdal_array.py, o script é finalizado sem nenhuma mensagem de erro ou qualquer outra coisa.
ATUALIZAÇÃO # 2:
Desinstalei o GDAL 1.9.1 e instalei o GDAL 1.6.1 a partir do Python Cheeseshop e dos binários do Windows da OSGeo. Ainda tinha o mesmo problema.
fonte
Respostas:
Como suspeito de muitos comentaristas, esse foi um problema com minha instalação. Aparentemente, eu não estava prestando muita atenção ao instalar o GDAL e os Python Bindings.
Instalei o GDAL Core e os plugins (dll's) do gisinternals.com, mas de alguma forma não pensei em instalar o Python Bindings a partir daí também. As ligações do Python que instalei eram de um site diferente (não me lembro qual delas neste momento).
Quando reinstalei o GDAL e o Python Bindings, todos do gisinternals.com, consegui o ReadAsArray com êxito.
Obrigado a todos que comentaram e responderam e peço desculpas pela minha ignorância.
fonte
É possível que seja um problema de memória. Quando você usa o ReadAsArray, ele traz os dados para a memória e, embora 800mb não seja grande, também não é pequeno. Você já tentou ler a matriz em pedaços?
Você deve poder percorrer a matriz e processá-la em pedaços de cada vez, embora, dependendo do processamento que você está fazendo, provavelmente deva procurar em áreas com sobreposição para evitar efeitos de borda.
fonte
data = b.ReadAsArray(0,0, 500, 500)
com o mesmo resultado.Desculpe, estou atrasado para esta festa, mas seu problema básico é que o Python de 32 bits não pode armazenar rasters muito grandes na memória. Você pode ler sua grande varredura na memória em pedaços pequenos, mas fica bastante limitado em termos do que você pode processar eficientemente sem ler / gravar extremamente ineficiente / frequente no disco.
O que eu faço (que sacrifica alguma eficiência devido à leitura / gravação de disco) é chamar ( via quebra -arquivo EXE ) a versão gisinternals.com de 64 bits de qualquer método gdal que você precisar. Tenha cuidado ao usar o módulo de subprocesso do python em um loop (ou seja, você pode / precisa chamar o subprocesso sequencialmente ), pois pode gerar inadvertidamente muitos threads abertos para a sua caixa do Windows e receber avisos ameaçadores do sistema. Você sacrifica um pouco a maneira de ler / gravar em disco com essa abordagem gdal, mas sua eficiência de processamento cai apenas (isto é, em relação a uma computação rápida na memória , se a sua caixa / biblioteca suportar isso) por um fator ou 10)
fonte