Processando vetor para rasterizar mais rápido com R


9

Estou convertendo vetor para varredura em R. No entanto, o processo foi muito longo. Existe a possibilidade de colocar o script no processamento multithread ou GPU para fazer isso mais rapidamente?

Meu script para vetor 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

classe: RasterLayer dimensões: 9636, 11476, 110582736 (nrow, ncol, ncell) resolução: 10, 10 (x, y) extensão: 505755, 620515, 8555432, 8651792 (xmin, xmax, ymin, ymax) coord. ref. : + proj = longlat + datum = WGS84 + ellps = WGS84 + towgs84 = 0,0,0

setor

classe: SpatialPolygonsDataFrame features: 5419 extension: 505755, 620515.4, 8555429, 8651792 (xmin, xmax, ymin, ymax) coord. ref. : + proj = utm + zona = 24 + sul + ellps = GRS80 + unidades = m + no_defs variáveis: 6 nomes: ID, CD_GEOCODI, TIPO, dens_imov, area_m, domicilios1 min values: 35464, 290110605000001, RURAL, 0.00000003,100004, 1.0000 valores máximos: 58468, 293320820000042, URBANO, 0.54581673,99996, 99.0000

Impressão de setor insira a descrição da imagem aqui


Você pode postar resumos de setor e r.raster? Gostaria de ter uma ideia do número de objetos no setor e das dimensões do r.raster. apenas imprimi-los é bom
mdsumner

Eu coloquei um resumo no corpo da questão.
Diogo Caribé 06/10

Não resumo, apenas imprimir - a informação que eu pedi para nós não tgere
mdsumner

Desculpe, eu coloquei a impressão.
Diogo Caribé 07/10

Ah, decepcionado, eu não pensei nisso até ver a impressão - verifique se a projeção da imagem corresponde aos polígonos, não está no momento - tente r <- raster (setor); res (r) <- 10; setor.r = rasterize (setor, r, 'dens_imov') - mas tente, definindo res (r) <- 250 primeiro, para que você tenha uma idéia de quanto tempo a versão em alta resolução levará
mdsumner

Respostas:


17

Eu tentei "paralelizar" a função rasterizeusando o Rpacote paralleldesta maneira:

  1. divida o objeto SpatialPolygonsDataFrame em npartes
  2. rasterize cada parte separadamente
  3. mesclar todas as partes em uma varredura

No meu computador, a rasterizefunção paralelizada levou 2,75 vezes menos que a rasterizefunção não paralelizada .

Nota: o código abaixo faz o download de um shapefile de polígono (~ 26,2 MB) da Web. Você pode usar qualquer objeto SpatialPolygonDataFrame. Este é apenas um exemplo.

Carregue bibliotecas e dados de exemplo:

# 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: Gráfico Brasil SpatialPolygonsDataFrame

Exemplo de thread simples

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

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

Tempo no meu laptop:

# Output:
# user  system elapsed 
# 23.883    0.010   23.891

Exemplo 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)

BrazilRaster

Figura 2: Gráfico Brasil Raster

Tempo no meu laptop:

# Output:
# user  system elapsed 
# 0.203   0.033   8.688 

Mais informações sobre paralelização em R :


Resposta muito boa!
Diogo Caribé 07/10

Você não apenas define n como o número de núcleos na máquina?
Sam

@ Sam Eu acho que deve funcionar sem problemas, mas não sei se é melhor ou não! Supus que, se eu dividisse os recursos em n partes iguais ao número de núcleos, talvez uma dessas partes pudesse ser mais fácil de processar e o núcleo que a processaria ficaria sem uso! No entanto, se você tiver mais peças do que núcleos quando um núcleo concluir o processamento de uma parte, será necessária outra. Mas certamente, não tenho certeza! Qualquer ajuda sobre esta questão seria apreciada.
Guzmán

vou fazer alguns testes hoje à noite. Em um pequeno arquivo de forma (aproximadamente 25 km por 25 km), rasterizado para 50 m, há uma pequena melhoria no uso de n = 2,4 ou 8 contra n = 20, 30 ou até 50. Subornarei um arquivo de forma muito grande hoje à noite e rasterize para 25m. O processamento de núcleo único é de 10 horas; portanto, veremos quais valores diferentes de n fazem !! (n = 50 é pouco menos de 1 hora)
Sam

@ Guzmán Estou executando o código novamente. No entanto, ele retornou algum erro e não sei por quê. Pode me ajudar? Erro no checkForRemoteErrors (val): 7 nós produziram erros; primeiro erro: objeto 'BRA_adm2' não encontrado
Diogo Caribé
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.