Procesando vector a ráster más rápido con R

9

Estoy convirtiendo vector a ráster en R. Sin embargo, el proceso fue demasiado largo. ¿Existe la posibilidad de poner el script en procesamiento multiproceso o GPU para hacerlo más rápido?

Mi guión al vector rasterizado.

r.raster = raster()
extent(r.raster) = extent(setor) #definindo o extent do raster
res(r.raster) = 10 #definindo o tamanho do pixel
setor.r = rasterize(setor, r.raster, 'dens_imov')

r.raster

clase: RasterLayer dimensiones: 9636, 11476, 110582736 (nrow, ncol, ncell) resolución: 10, 10 (x, y) extensión: 505755, 620515, 8555432, 8651792 (xmin, xmax, ymin, ymax) coord. árbitro. : + proj = longlat + datum = WGS84 + ellps = WGS84 + towgs84 = 0,0,0

setor

clase: SpatialPolygonsDataFrame características: 5419 extensión: 505755, 620515.4, 8555429, 8651792 (xmin, xmax, ymin, ymax) coord. árbitro. : + proj = utm + zone = 24 + south + ellps = GRS80 + unidades = m + no_defs variables: 6 nombres: ID, CD_GEOCODI, TIPO, dens_imov, area_m, domicilios1 valores mínimos: 35464, 290110605000001, RURAL, 0.00000003,100004, 1.0000 valores máximos: 58468, 293320820000042, URBANO, 0.54581673,99996, 99.0000

Grabado de setor ingrese la descripción de la imagen aquí

Diogo Caribé
fuente
¿Puedes publicar resúmenes de setor y r.raster? Me gustaría tener una idea del número de objetos en setor y las dimensiones de r.raster. simplemente imprimirlos está bien
mdsumner
Puse el resumen en el cuerpo de la pregunta.
Diogo Caribé
No es un resumen, solo imprima: la información que solicité no es nuestra
mdsumner el
Lo siento, puse la impresión.
Diogo Caribé
Ah, decepcionado, no pensé en esto hasta que vi la impresión: asegúrese de que la proyección de la trama coincida con los polígonos, por el momento no lo hace - intente r <- raster (setor); res (r) <- 10; setor.r = rasterizar (setor, r, 'dens_imov') - pero también intente, estableciendo res (r) <- 250 primero para que tenga una idea de cuánto tiempo llevará la versión de alta resolución
mdsumner

Respuestas:

17

Traté de "paralelizar" la función rasterizeusando el Rpaquete parallelde esta manera:

  1. dividir el objeto SpatialPolygonsDataFrame en npartes
  2. rasterize cada parte por separado
  3. fusionar todas las partes en una trama

En mi computadora, la rasterizefunción paralelizada tomó 2.75 veces menos que la función no paralelizada rasterize.

Nota: el siguiente código descarga un archivo de forma poligonal (~ 26.2 MB) de la web. Puede usar cualquier objeto SpatialPolygonDataFrame. Este es solo un ejemplo.

Cargar bibliotecas y datos de ejemplo:

# Load libraries
library('raster')
library('rgdal')

# Load a SpatialPolygonsDataFrame example
# Load Brazil administrative level 2 shapefile
BRA_adm2 <- raster::getData(country = "BRA", level = 2)

# Convert NAMES level 2 to factor 
BRA_adm2$NAME_2 <- as.factor(BRA_adm2$NAME_2)

# Plot BRA_adm2
plot(BRA_adm2)
box()

# Define RasterLayer object
r.raster <- raster()

# Define raster extent
extent(r.raster) <- extent(BRA_adm2)

# Define pixel size
res(r.raster) <- 0.1

Brasil SPDF

Figura 1: Gráfico de Brasil SpatialPolygonsDataFrame

Ejemplo de hilo simple

# Simple thread -----------------------------------------------------------

# Rasterize
system.time(BRA_adm2.r <- rasterize(BRA_adm2, r.raster, 'NAME_2'))

Tiempo en mi laptop:

# Output:
# user  system elapsed 
# 23.883    0.010   23.891

Ejemplo de hilo multiproceso

# Multithread -------------------------------------------------------------

# Load 'parallel' package for support Parallel computation in R
library('parallel')

# Calculate the number of cores
no_cores <- detectCores() - 1

# Number of polygons features in SPDF
features <- 1:nrow(BRA_adm2[,])

# Split features in n parts
n <- 50
parts <- split(features, cut(features, n))

# Initiate cluster (after loading all the necessary object to R environment: BRA_adm2, parts, r.raster, n)
cl <- makeCluster(no_cores, type = "FORK")
print(cl)

# Parallelize rasterize function
system.time(rParts <- parLapply(cl = cl, X = 1:n, fun = function(x) rasterize(BRA_adm2[parts[[x]],], r.raster, 'NAME_2')))

# Finish
stopCluster(cl)

# Merge all raster parts
rMerge <- do.call(merge, rParts)

# Plot raster
plot(rMerge)

BrazilRaster

Figura 2: Parcela de trama de Brasil

Tiempo en mi laptop:

# Output:
# user  system elapsed 
# 0.203   0.033   8.688 

Más información sobre paralelización en R :

Guzmán
fuente
Muy buena respuesta!
Diogo Caribé
¿No solo establece n como el número de núcleos en la máquina?
Sam
@Sam ¡Creo que debería funcionar sin problemas, pero no sé si es mejor o no! Supuse que si dividía las características en n partes iguales al número de núcleos, ¡ tal vez una de estas partes podría ser más fácil de procesar y el núcleo que procesó sería inútil! Sin embargo, si tiene más partes que núcleos cuando un núcleo termina de procesar una parte, tomaría otra parte. ¡Pero ciertamente, no estoy seguro! Cualquier ayuda sobre este tema sería apreciada.
Guzmán
Voy a hacer algunas pruebas esta noche. En un archivo de forma pequeño (aproximadamente 25 km por 25 km), rasterizado a 50 m, hay una pequeña mejora en el uso de n = 2,4 u 8 contra n = 20, 30 o hasta 50. Esta noche subtitularé en un archivo de forma muy grande. y rasterizar a 25m. ¡El procesamiento de un solo núcleo es de 10 horas, así que veremos qué valores diferentes de n hacen !! (n = 50 es poco menos de 1 hora)
Sam
@ Guzmán Estoy ejecutando el código nuevamente. Sin embargo, recuperó algunos errores y no sé por qué. ¿Me puedes ayudar? Error en checkForRemoteErrors (val): 7 nodos produjeron errores; primer error: no se encontró el objeto 'BRA_adm2'
Diogo Caribé