Paúl, parte de este staff, nos hizo el favor de redactar esta sección ya que controla perfectamente este tema.
Solución:
Una gran característica de los datos ráster es que a menudo permiten el procesamiento por bloques. Puede “dividir” el ráster en ventanas rectangulares para reducir la huella de memoria de su proceso, o para procesar bloques en paralelo y obtener resultados más rápido.
La documentación para los enlaces de Python de GDAL es escasa y los ejemplos de cómo obtener ventanas de trama usando ReadAsArray()
son escasos, pero encontré esto en las pruebas GDAL: https://github.com/OSGeo/gdal/blob/77544764f51420e42468641fc3d5a087f8ea6d8f/autotest/gcore/numpy_rw.py#L115. Pase algunas compensaciones y el ancho y el alto de su ventana y tendrá un subconjunto de banda como un numpy array.
Para aplicar esto en su programa, haga un bucle sobre los bloques del ráster y, dentro de ese bucle, sobre las bandas del ráster.
Cuando usted Leer como matriz ()estás creando un numpy array, lo que esencialmente significa que lo estás cargando en la memoria. Para un TIF de 30 GB, espere algo similar. Es decir, solo podrá trabajar con él si tiene una estación de trabajo o servidor de más de 64 GB. E incluso entonces, no es deseable.
Para rásteres más grandes, considere trabajar con bloques. Aquí hay un buen tutorial sobre esto (a partir de la página 24). Tenga en cuenta, sin embargo, que este documento se escribió para una versión anterior de GDAL. Desde la versión 2.0, obtener el tamaño de bloque personalizado de un ráster se realiza con el método GDALRasterBand::GetBlockSize().
También tenga en cuenta que un ráster se itera de manera más eficiente sobre su tamaño de bloque predeterminado (cada formato de ráster tendrá el suyo). Sin embargo, el tipo de bloque de un TIFF puede ser mosaico o franja. Mosaico significa un bloque rectangular, y los TIFF creados con GDAL tienen ese valor predeterminado (específicamente, un mosaico de 256×256), pero los TIFF con tipo de tira tienen bloques que abarcan todo el ancho del ráster, e incluso pueden tener solo una fila de alto. Esto no solo dificulta ciertos procesos (como el kernel), sino que también puede consumir demasiada memoria. Comprueba el tamaño de tu bloque de antemano y, si es una tira, elige un tamaño de bloque personalizado.
Sección de Reseñas y Valoraciones
Si te gusta el tema, eres capaz de dejar un escrito acerca de qué te ha gustado de este ensayo.