Elaborazione del vettore in raster più veloce con R


9

Sto convertendo il vettore in raster in R. Tuttavia il processo è stato troppo lungo. Esiste la possibilità di mettere lo script in elaborazione multithread o GPU per farlo più velocemente?

La mia sceneggiatura al vettore rasterizzato.

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

classe: RasterLayer dimensioni: 9636, 11476, 110582736 (nrow, ncol, ncell) risoluzione: 10, 10 (x, y) estensione: 505755, 620515, 8555432, 8651792 (xmin, xmax, ymin, ymax) coord. rif. : + proj = longlat + datum = WGS84 + ellps = WGS84 + towgs84 = 0,0,0

Setor

classe: SpatialPolygonsDataFrame caratteristiche: estensione 5419: 505755, 620515.4, 8555429, 8651792 (xmin, xmax, ymin, ymax) coord. rif. : + proj = utm + zone = 24 + south + ellps = GRS80 + unità = m + no_defs variabili: 6 nomi: ID, CD_GEOCODI, TIPO, dens_imov, area_m, domicilios1 valori min: 35464, 290110605000001, RURAL, 0,00000003,100004, Valori max 1.0000: 58468, 293320820000042, URBANO, 0,54581673,99996, 99,0000

Stampa di setor inserisci qui la descrizione dell'immagine


Puoi pubblicare riassunti di setor e r.raster? Mi piacerebbe avere un'idea del numero di oggetti in setor e delle dimensioni di r.raster. basta stamparli va bene
mdsumner

Ho messo il riassunto nel corpo della domanda.
Diogo Caribé,

Non sommario, basta stampare - le informazioni che ho chiesto per noi non tgere
mdsumner

Scusa, ho messo la stampa.
Diogo Caribé,

Ah, deluso, non ci ho pensato fino a quando non ho visto la stampa - assicurati che la proiezione del raster corrisponda ai poligoni, al momento non lo fa - prova r <- raster (setor); res (r) <- 10; setor.r = rasterize (setor, r, 'dens_imov') - ma prova anche a impostare prima res (r) <- 250 in modo da avere un'idea di quanto tempo impiegherà la versione ad alta risoluzione
mdsumner,

Risposte:


17

Ho provato a "parallelizzare" la funzione rasterizeusando il Rpacchetto parallelin questo modo:

  1. dividere l' oggetto SpatialPolygonsDataFrame in nparti
  2. rasterize ogni parte separatamente
  3. unire tutte le parti in un raster

Nel mio computer, la rasterizefunzione parallelizzata ha impiegato 2,75 volte in meno rispetto alla funzione non parallelizzata rasterize.

Nota: il codice seguente scarica un file di forma poligonale (~ 26,2 MB) dal Web. È possibile utilizzare qualsiasi oggetto SpatialPolygonDataFrame. Questo è solo un esempio.

Carica librerie e dati di esempio:

# 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

BrazilSPDF

Figura 1: Trama Brasile SpatialPolygonsDataFrame

Esempio di thread semplice

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

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

Tempo nel mio laptop:

# Output:
# user  system elapsed 
# 23.883    0.010   23.891

Esempio di thread multithread

# 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: trama trama Brasile

Tempo nel mio laptop:

# Output:
# user  system elapsed 
# 0.203   0.033   8.688 

Maggiori informazioni sulla parallelizzazione in R :


Ottima risposta!
Diogo Caribé,

Non imposti semplicemente n come numero di core sulla macchina?
Sam,

@Sam Penso che dovrebbe funzionare senza problemi ma non so se sia meglio o no! Supponevo che se avessi diviso le caratteristiche in n parti uguali al numero di core, forse una di queste parti potrebbe essere più facile da elaborare e il nucleo che lo avrebbe elaborato sarebbe stato inutile! Tuttavia, se si hanno più parti rispetto ai core quando un core termina l'elaborazione di una parte, ne prenderebbe un'altra parte. Ma certamente non ne sono sicuro! Qualsiasi aiuto su questo problema sarebbe apprezzato.
Guzmán,

Eseguirò alcuni test stasera. Su un piccolo file di forma (circa 25 km per 25 km), rasterizzato a 50 m, c'è un piccolo miglioramento nell'uso di n = 2,4 o 8 contro n = 20, 30 o fino a 50. Stasera subirò un file di forma molto grande e rasterizzare a 25m. L'elaborazione single core è di 10 ore, quindi vedremo quali diversi valori di n fanno !! (n = 50 è poco meno di 1 ora)
Sam

@ Guzmán Sto eseguendo di nuovo il codice. Tuttavia, ha ripreso qualche errore e non so perché. Mi potete aiutare? Errore in checkForRemoteErrors (val): 7 nodi hanno prodotto errori; primo errore: oggetto 'BRA_adm2' non trovato
Diogo Caribé
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.