
Un archivo satelital que pesa un par de gigabytes hace que RStudio se quede pegado, mientras que otra persona con el mismo computador lo abre sin ningún drama. Me lo he preguntado tantas veces que ya perdí la cuenta, cada vez que el ventilador de mi laptop empieza a sonar fuerte y el cursor deja de responder, como si le hubiera pedido que resolviera algo imposible. La pregunta se quedó ahí, dando vueltas, mientras yo seguía metida en esto del procesamiento de raster y la teledetección por mi cuenta, entre el trabajo de oficina y los ratos libres del fin de semana.
Antes de meterme en la explicación técnica tengo que soltar el dato: algunos enlaces de este texto son de afiliado, y uno de ellos es al curso Teledetección Satelital con R y R-Studio, que fue justamente donde entendí que el problema de la memoria no era mío, sino de la herramienta que estaba usando. No pongo nada acá que no haya probado yo misma, tratando de no perder la cabeza entre el código y la lluvia.
R se cae cuando el archivo pesa demasiado
Durante un buen tiempo pensé que el problema era yo, torpe con el código, hasta que entendí que el asunto es cómo R maneja la memoria. Por defecto, hay paquetes antiguos que intentan meter la imagen completa dentro de la RAM apenas la abres. Si estás trabajando con un raster que pesa varios gigabytes y tu laptop tiene apenas 8 o 16 de RAM, el sistema no da abasto. Es parecido a tratar de guardar toda la fruta y las flores del mercado fluvial en una sola bolsa de género: en algún momento la bolsa se rompe, no importa cuánto la estires. (No voy a entrar aquí en qué es exactamente un raster —eso ya lo dejé escrito en otra entrada— pero para lo que sigue basta con pensarlo como una grilla enorme de píxeles con un valor cada uno.)

El mensaje que más veía en la consola era el clásico "cannot allocate vector of size X Gb", y al principio no tenía sentido: mi disco duro tenía espacio de sobra, entonces no entendía por qué R me decía que no cabía. Antes de llegar a R, había probado usar Google Earth para comparar imágenes de distintos años del mismo sector de bosque, pero ahí no podía medir nada ni guardar nada que me sirviera después: servía para mirar, no para trabajar. Cuento con más detalle ese tramo del camino en mi experiencia aprendiendo teledetección con R sin ser programadora, pero el resumen es que cambié de herramienta cuando entendí que el problema no era mi computador, sino el paquete: muchos de mis errores de memoria venían de uno antiguo que cargaba la imagen entera a la RAM en lugar de leerla por bloques.
Raster contra terra: dos formas de leer la misma imagen satelital
Ambos paquetes —raster y terra— leen el mismo archivo de maneras completamente distintas. El primero, en la mayoría de los casos, trata de cargar todo a la memoria apenas lo abres. El segundo crea algo así como un puntero al archivo que sigue guardado en el disco, y solo va leyendo los pedacitos que necesita en cada paso. La diferencia entre uno y otro casi no se nota con un archivo chico, pero apenas subes a una imagen de varios gigabytes, se convierte en la diferencia entre que el proceso corra o que la ventana de RStudio se cierre sin avisar.
Una imagen de Landsat 8, por ejemplo, tiene una resolución espacial de 30 metros y trae once bandas distintas de información, así que pesa bastante incluso antes de que empieces a procesarla. Con raster, intentar abrir esas once bandas de una sola vez casi siempre terminaba en la pantalla gris de RStudio congelándose. Con terra, el comando rast() hace lo mismo pero sin ahogar la memoria, y la primera vez que cargué una imagen completa sin que el ventilador se disparara, fui corriendo a mostrarle la pantalla a Marcia, mi compañera de oficina, que se puso feliz como si el mapa fuera de ella.

Casi siempre trato de trabajar con el mismo sistema de coordenadas de principio a fin, porque mezclar proyecciones distintas es otro dolor de cabeza aparte (ese tema lo dejo para cómo corregir proyecciones cartográficas en R de forma sencilla). Tener esto resuelto importa todavía más si más adelante te metes en cosas como el modelado de especies con Maxent, donde si los rasters no calzan entre sí, derechamente no funciona nada. Lo que sí puedo decir acá, sin desviarme mucho del tema de hoy, es que recortar la imagen al área de estudio apenas la cargas —antes de hacer cualquier otra cosa— es, la mayoría de las veces, la solución más simple a casi todos los problemas de memoria que he tenido.
Lo que Google Earth no me pudo dar
Con Google Earth uno puede mirar dos años distintos del mismo cerro y notar, a ojo, que el verde cambió. Pero ahí se acaba: no hay manera de sacar un número, de guardar esa comparación en un archivo que puedas volver a abrir, ni de repetir el mismo análisis en otra parte del mapa sin hacerlo todo de nuevo a mano. R, con toda la lata que da al principio, permite guardar el script, correrlo de nuevo en otra zona y quedarte con un archivo que puedes revisar después sin tener que recordar qué habías hecho.
Hubo una tarde de lluvia bastante fuerte en la que corrí todo el script de principio a fin y no apareció ni una sola línea roja en la consola, ninguna advertencia, ningún error a mitad de camino. Me quedé mirando la pantalla un rato largo, casi esperando que algo se rompiera, porque ya me había acostumbrado a que algo siempre fallara antes de llegar al final.
Trucos que reducen el peso antes de que R se ahogue
Otro tropiezo típico al empezar con esto es tratar de graficar la imagen completa de una sola vez: R intenta dibujar cada uno de los millones de píxeles y ahí es donde se cuelga de nuevo. Lo que ayuda es usar plot() con un límite de píxeles, o trabajar con una versión de baja resolución solo para probar que el código funciona antes de correr el proceso final sobre el archivo pesado de verdad. R no hace el cálculo grande hasta que se lo pides explícitamente, así que aprovechar eso ahorra harto tiempo de espera frente a la pantalla.
Hay otros detalles chicos que también ayudan. R genera hartos archivos temporales mientras procesa, así que de vez en cuando conviene limpiar esa carpeta para no ir sumando peso sin darse cuenta. Y a veces cargamos los datos como números decimales cuando en realidad solo necesitamos números enteros, lo que duplica el tamaño del archivo sin que uno entienda muy bien por qué. Aldo, un lector de Temuco que me escribe cada cierto tiempo —desaparece meses y después vuelve con una duda nueva, como si no hubiera pasado el tiempo—, me contó hace poco que su computador se le colgaba tratando de abrir una imagen de varios gigabytes, y bastó con revisar esos dos puntos para que el proceso empezara a correr.

Cuándo conviene quedarse con raster y cuándo no
Si tienes un script viejo que ya funciona, que no vas a tocar más y que corre con archivos livianos, no hay ningún drama en dejarlo tal como está con library(raster); cambiar de paquete por cambiar no tiene mucho sentido. Pero si vas a seguir trabajando con imágenes satelitales pesadas —Sentinel, Landsat, lo que sea— y tu computador no es una máquina pensada para diseño pesado, cámbiate a library(terra) apenas puedas. La curva para acostumbrarte a los nombres nuevos de las funciones es corta, y lo que ganas en que el programa no se cuelgue vale mucho más que ese ajuste inicial.
Cuando entendí bien esa diferencia entre los dos paquetes, dejé de tratar de forzar a mi laptop a hacer todo de una sola vez. Ahora divido el trabajo, recorto el área que me interesa antes que cualquier otra cosa, y confío en herramientas pensadas para gente con equipos normales, no con servidores grandes. Si sientes que te estás hundiendo en errores de memoria y que R simplemente no es lo tuyo, no te desanimes tan rápido: a veces el problema no es que te falte RAM, sino que estás usando la herramienta equivocada. A mí me sirvió mucho ordenar lo que iba aprendiendo con el curso de Teledetección Satelital con R y R-Studio, porque ahí enseñan justamente a manejar estos volúmenes de datos sin perder la paciencia en el intento.
Ahora, cada vez que quiero ver cómo cambió la vegetación de un año a otro, sé cómo bajar la imagen, cargarla sin que el computador se apague solo, y sacar un mapa que diga algo real sobre lo que está pasando ahí arriba. Para alguien que empezó sin saber qué era una proyección, eso ya es harto.