Tengo una base de datos geográfica que contiene un gran número de conjuntos de datos ráster: hay dos rásteres para cada país del mundo, y son muy grandes, en algunos casos hasta 3 GB por conjunto de datos ráster.
Tengo que convertirlos en matrices NumPy para ejecutar un programa analítico que he escrito sobre ellos, pero me encuentro con un error de memoria cuando mi script intenta convertir el primer conjunto de datos raster. El script crea una lista de todos los rásteres en el conjunto de datos (rasterList), luego toma los códigos de los países al final de cada nombre del conjunto de datos ráster y rellena una nueva lista con todos los códigos de los países. A continuación, borro rasterList, e itero a través de los códigos de los países, convirtiendo los rásteres en 'GLUR_'+código o 'Pop00_'+código. Borro cada ráster de la memoria después de convertirlo, pero el programa no llega ni siquiera a eso...
El código es:
import arcpy, os
import numpy as np
from arcpy import env
env.workspace = "J:/Data/CISC.gdb"
filepath = "J:/LIVE/"
rasterList = arcpy.ListRasters("G*")
codeList = []
for raster in rasterList:
codeList.append(raster[5:])
del rasterList
for code in codeList:
print code
inputGLUR = arcpy.Raster("J:/Data/CISC.gdb/GLUR_"+code)
lowerLeft = arcpy.Point(inputGLUR.extent.XMin, inputGLUR.extent.YMin)
cellSize = inputGLUR.meanCellWidth
print "Converting GLUR_"+code, "to NumPy array"
arr = arcpy.RasterToNumPyArray(inputGLUR, nodata_to_value=0)
os.chdir("J:/LIVE/NumPy_GLUR")
numpy.save("GLUR_"+code+".npy", arr)
print "GLUR Converted"
del inputGLUR
del arr
inputPop = arcpy.Raster("J:/Data/CISC.gdb/Pop00_"+code)
lowerLeft = arcpy.Point(inputPop.extent.XMin, inputPop.extent.YMin)
cellSize = inputPop.meanCellWidth
print "Converting Pop00_"+code, "to NumPy array"
arr = arcpy.RasterToNumPyArray(inputPop, nodata_to_value=0)
os.chdir("J:/LIVE/NumPy_Pop")
numpy.save("Pop00_"+code, arr)
print "Population array converted"
del inputPop
del arr
y da este error:
Traceback (most recent call last):
File "J:\PYTHON\RasterToNumPy.py", line 21, in <module>
arr = arcpy.RasterToNumPyArray(inputGLUR, nodata_to_value=0)
File "C:\Program Files (x86)\ArcGIS\Desktop10.3\ArcPy\arcpy\__init__.py", line 2244, in RasterToNumPyArray
return _RasterToNumPyArray(*args, **kwargs)
MemoryError
Esto es en un ordenador con un procesador i7 y 16GB de RAM. Los datos se almacenan en un disco externo. Alguna idea sobre cómo manejar rasters de este tamaño?