Traitement plus rapide du vecteur pour raster avec R

9

Je convertis le vecteur en raster en R. Cependant, le processus était trop long. Est-il possible de mettre le script en traitement multithread ou GPU afin de le faire plus rapidement?

Mon script au vecteur tramé.

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 dimensions: 9636, 11476, 110582736 (nrow, ncol, ncell) résolution: 10, 10 (x, y) étendue: 505755, 620515, 8555432, 8651792 (xmin, xmax, ymin, ymax) coord. réf. : + proj = longlat + datum = WGS84 + ellps = WGS84 + towgs84 = 0,0,0

setor

classe: SpatialPolygonsDataFrame: 5419 étendue: 505755, 620515.4, 8555429, 8651792 (xmin, xmax, ymin, ymax) coord. réf. : + proj = utm + zone = 24 + south + ellps = GRS80 + units = m + no_defs variables: 6 noms: ID, CD_GEOCODI, TIPO, dens_imov, area_m, domicilios1 valeurs min: 35464, 290110605000001, RURAL, 0.00000003,100004, 1,0000 valeurs maximales: 58468, 293320820000042, URBANO, 0,54581673,99996, 99,0000

Impression de setor entrez la description de l'image ici

Diogo Caribé
la source
Pouvez-vous publier des résumés de setor et r.raster? Je voudrais avoir une idée du nombre d'objets dans setor et des dimensions de r.raster. il suffit de les imprimer, c'est bien
mdsumner
Je mets le résumé dans le corps de la question.
Diogo Caribé
Pas de résumé, il suffit d'imprimer - les informations que je vous ai demandées ne sont pas tgere
mdsumner
Désolé, j'ai mis l'impression.
Diogo Caribé
Ah, déçu de ne pas avoir pensé à cela avant d'avoir vu l'impression - assurez-vous que la projection du raster correspond aux polygones, ce n'est pas le cas pour le moment - essayez r <- raster (setor); res (r) <- 10; setor.r = rasterize (setor, r, 'dens_imov') - mais essayez aussi de régler res (r) <- 250 d'abord pour avoir une idée du temps que prendra la version haute résolution
mdsumner

Réponses:

17

J'ai essayé de "paralléliser" la fonction en rasterizeutilisant le Rpackage parallelde cette manière:

  1. diviser l' objet SpatialPolygonsDataFrame en nparties
  2. rasterize chaque partie séparément
  3. fusionner toutes les pièces en un seul raster

Dans mon ordinateur, la rasterizefonction parallélisée prenait 2,75 fois moins que la fonction non parallélisée rasterize.

Remarque: le code ci-dessous télécharge un fichier de formes polygonales (~ 26,2 Mo) depuis le Web. Vous pouvez utiliser n'importe quel objet SpatialPolygonDataFrame. Ce n'est qu'un exemple.

Charger des bibliothèques et des exemples de données:

# 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

BrésilSPDF

Figure 1: Graphique SpatialPolygonsDataFrame du Brésil

Exemple de thread simple

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

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

Temps dans mon ordinateur portable:

# Output:
# user  system elapsed 
# 23.883    0.010   23.891

Exemple de 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)

BrésilRaster

Figure 2: tracé matriciel du Brésil

Temps dans mon ordinateur portable:

# Output:
# user  system elapsed 
# 0.203   0.033   8.688 

Plus d'informations sur la parallélisation dans R :

Guzmán
la source
Très bonne réponse!
Diogo Caribé
Ne définissez-vous pas simplement n comme le nombre de cœurs sur la machine?
Sam
@Sam Je pense que cela devrait fonctionner sans problème mais je ne sais pas si c'est mieux ou pas! J'ai supposé que si je divisais les fonctionnalités en n parties égales au nombre de cœurs, l' une de ces parties pourrait peut-être être plus facile à traiter et le cœur qui l'a traité serait sans utilisation! Cependant, si vous avez plus de pièces que de cœurs quand un cœur finit de traiter une partie, il en faudrait une autre. Mais certainement, je ne suis pas sûr! Toute aide sur cette question serait appréciée.
Guzmán
je vais faire des tests ce soir. Sur un petit fichier de formes (environ 25 km sur 25 km), pixellisé à 50 m, il y a une petite amélioration dans l'utilisation de n = 2,4 ou 8 contre n = 20, 30 ou jusqu'à 50. Je souscrirai à un très grand fichier de formes ce soir et pixelliser à 25 m. Le traitement sur un seul cœur dure 10 heures, nous verrons donc quelles sont les différentes valeurs de n !! (n = 50 est un peu moins de 1 heure)
Sam
@ Guzmán Je suis à nouveau en train d'exécuter le code. Cependant, cela a ressurgi une erreur et je ne sais pas pourquoi. Pouvez-vous m'aider? Erreur dans checkForRemoteErrors (val): 7 nœuds ont produit des erreurs; première erreur: objet 'BRA_adm2' non trouvé
Diogo Caribé