Suite

Gdal_array.SaveArray() laisse l'ensemble de données ouvert en Python

Gdal_array.SaveArray() laisse l'ensemble de données ouvert en Python


Quand j'utilisegdal_array.SaveArray()pour créer un raster, le jeu de données nouvellement créé semble rester ouvert dans Python, empêchant d'autres processus de travailler avec lui. Par exemple, considérons le code (super minimal) suivant :

>>> a = np.arange(300).reshape((3, 10, 10)) >>> gdal_array.SaveArray(a, "test.tif")  > >>> os.rename("test.tif", "test2.tif") Traceback (appel le plus récent en dernier): Fichier "", ligne 1, dans  Erreur Windows : [Erreur 32] Le processus ne peut pas accéder au fichier car il est utilisé par un autre processus

Je ne peux pas non plus déplacer, renommer ou supprimer le fichier directement depuis l'explorateur Windows, avec le messageL'action ne peut pas être terminée car le fichier est ouvert dans python.exe. Plus important encore, je ne peux pas ouvrir le fichier de certains programmes de visualisation/traitement que j'utilise. Une fois que je quitte python, le fichier est "libéré" et je peux le manipuler à ma guise.

Il ne semble pas que le fichier ait un nom associé, donc je ne peux pas le fermer comme je le ferais avec un raster que j'avais spécifiquement ouvert :

>>> dir() ['__builtins__', '__doc__', '__name__', '__package__', 'a', 'gdal', 'gdal_array', 'np', 'os']

Qu'est-ce qui cause ce comportement ? Y a-t-il un moyen d'appelerSaveArray()de telle sorte qu'il ne garde pas le fichier ouvert après l'avoir écrit ? Ou, un moyen de fermer le fichier depuis Python ?

Au cas où cela serait important, mes liaisons Python proviennent de gdal 1.11.1 pour Python 2.7.8 sous Windows 7.


Modifier en fonction des commentaires ci-dessous :

L'attribution de l'appel gdal_array.SaveArray(a, "test.tif") à une variable renvoie un objet osgeo.gdal.Dataset qui peut être géré conformément aux pièges ci-dessous. En utilisant l'exemple ci-dessus, cela devrait fonctionner :

a = np.arange(300).reshape((3, 10, 10)) ds = gdal_array.SaveArray(a, "test.tif") ds = Aucun os.rename("test.tif", "test2.tif ")

Consultez la documentation Python gotchas : https://trac.osgeo.org/gdal/wiki/PythonGotchas

Spécifiquement:

Enregistrer et fermer des ensembles de données/sources de données

Pour enregistrer et fermer les jeux de données raster GDAL ou les sources de données vectorielles OGR, l'objet doit être déréférencé, par exemple en le définissant sur Aucun, une valeur différente ou en supprimant l'objet. S'il existe plusieurs copies de l'ensemble de données ou de l'objet de source de données, chaque copie doit être déréférencée.

Par exemple, créer et enregistrer un jeu de données raster :

>>> depuis osgeo import gdal >>> driver = gdal.GetDriverByName('GTiff') >>> dst_ds = driver.Create('new.tif', 10, 15) >>> band = dst_ds.GetRasterBand(1) >>> arr = band.ReadAsArray() # les valeurs raster sont toutes à zéro >>> arr[2, 4:] = 50 # modifie certaines données >>> band.WriteArray(arr) # fichier raster toujours non modifié >>> band = Aucun # bande de déréférencement pour éviter le piège décrit précédemment >>> dst_ds = Aucun # enregistrer, fermer

Le dernier déréférencement au jeu de données raster écrit les modifications de données et ferme le fichier raster. WriteArray(arr) n'écrit pas la matrice sur le disque, sauf si le cache de blocs GDAL est plein (généralement 40 Mo).

Avec certains pilotes, les jeux de données raster peuvent être enregistrés par intermittence sans se fermer à l'aide de FlushCache(). De même, les ensembles de données vectorielles peuvent être enregistrés à l'aide de SyncToDisk(). Cependant, aucune de ces méthodes ne garantit que les données sont écrites sur le disque, la méthode préférée consiste donc à désallouer comme indiqué ci-dessus.


Voir la vidéo: Reading the MNIST Dataset as a numpy array.