J'utilise Python 2.6.5 (32 bits) avec Numpy 1.3 et Gdal 1.9.1 installés sur Windows 7 64 bits. J'essaie de lire un ensemble de données raster de 800 Mo Imagine (.img) dans un tableau Numpy pour faire de l'algèbre raster, mais dès que j'exécute le code suivant, Python.exe se bloque.
from osgeo import gdal
g = gdal.Open(r'path\to\dataset', gdal.GA_Readonly)
b = g.GetRasterBand(1)
data = b.ReadAsArray()
Python.exe se bloque lors de l' b.ReadAsArray()
appel. J'ai fait des recherches sur Google et j'ai trouvé des articles datés de Gdal 1.6 qui mentionnaient ce problème avec Windows 7 64 bits, mais ils ont également mentionné qu'il avait été corrigé dans les dernières versions de développement à l'époque.
Quelqu'un d'autre a-t-il eu ce problème? Des solutions?
MISE À JOUR:
J'ai décidé de déboguer le code dans PyDev pour essayer de déterminer où il échoue. D'après ce que je peux dire (toujours pas de message d'erreur), il échoue à la ligne 22 de gdal_array.py.
_mod = imp.load_module('_gdal_array', fp, pathname, description)
Lorsque j'entre dans la ligne de code ci-dessus, cela m'amène dans le module init .py de numpy. Quand j'arrive à la fin du numpy. __ init __ .py module, il revient à la ligne de code ci-dessus. Ensuite, lorsque je clique sur le bouton Étape vers, qui devrait m'amener à la ligne suivante dans gdal_array.py, le script se termine sans aucun message d'erreur ou quoi que ce soit.
MISE À JOUR # 2:
J'ai désinstallé GDAL 1.9.1 et installé GDAL 1.6.1 à partir de Python Cheeseshop et des binaires Windows d'OSGeo. Avait toujours le même problème.
la source
Réponses:
Comme de nombreux commentateurs le soupçonnaient, c'était un problème avec mon installation. Apparemment, je ne portais pas assez d'attention à l'installation de GDAL et des liaisons Python.
J'ai installé GDAL Core et les plugins (dll's) de gisinternals.com, mais je n'ai pas pensé à installer les liaisons Python à partir de là aussi. Les liaisons Python que j'ai installées provenaient d'un site différent (je ne me souviens plus lequel à ce stade).
Lorsque j'ai réinstallé GDAL et les liaisons Python à partir de gisinternals.com, j'ai réussi à lire ReadAsArray.
Merci à tous ceux qui ont commenté et répondu et je m'excuse pour mon ignorance.
la source
Il est possible que ce soit un problème de mémoire. Lorsque vous utilisez ReadAsArray, il met les données en mémoire, et bien que 800 Mo ne soient pas massifs, ils ne sont pas minuscules non plus. Avez-vous essayé de lire le tableau par blocs?
Vous devriez pouvoir parcourir le tableau et le traiter en bloc à la fois, mais selon le traitement que vous effectuez, vous devriez probablement chercher à lire dans les zones avec chevauchement pour éviter les effets de bord.
la source
data = b.ReadAsArray(0,0, 500, 500)
avec le même résultat.Désolé, je suis en retard à cette fête, mais votre problème de base est que Python 32 bits ne peut pas stocker de très grands rasters en mémoire. Vous pouvez lire votre grand raster en mémoire par morceaux de petite taille, mais vous êtes alors assez limité en termes de ce que vous pouvez traiter efficacement sans lecture / écriture extrêmement inefficace / fréquente sur le disque.
Ce que je fais à la place (qui sacrifie une certaine efficacité en raison de la lecture / écriture sur le disque) est d'appeler ( via l'encapsulage EXE ) la version gisinternals.com 64 bits de la méthode gdal dont vous avez besoin. Soyez prudent avec l'utilisation du module de sous-processus de python dans une boucle (c'est-à-dire que vous voudrez / devrez peut-être appeler un sous-processus séquentiellement ) car vous risquez de générer par inadvertance trop de threads ouverts pour votre boîte Windows et d'obtenir des avertissements inquiétants du système. Vous sacrifiez un peu dans la manière de lire / écrire sur le disque avec cette approche gdal, mais votre efficacité de traitement ne diminue que (c'est-à-dire par rapport à un calcul rapide en mémoire , si votre box / bibliothèque peut le supporter) d'environ un facteur ou dix.
la source