R ile daha hızlı tarama yapmak için vektör işleniyor


9

R'de raster vektörü dönüştürüyorum. Ancak süreç çok uzundu. Daha hızlı yapmak için betiği çok iş parçacığına veya GPU işlemeye koyma olasılığı var mı?

Rasterleştirilmiş vektöre benim senaryom.

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

sınıf: RasterLayer boyutları: 9636, 11476, 110582736 (nrow, ncol, ncell) çözünürlük: 10, 10 (x, y) kapsam: 505755, 620515, 8555432, 8651792 (xmin, xmax, ymin, ymax) koordinatı. ref. : + proj = longlat + referans noktası = WGS84 + ellps = WGS84 + towgs84 = 0,0,0

setor

class: SpatialPolygonsDataFrame özellikleri: 5419 kapsam: 505755, 620515.4, 8555429, 8651792 (xmin, xmax, ymin, ymax) koordinatı. ref. : + proj = utm + bölge = 24 + güney + ellps = GRS80 + birim = m + no_defs değişkenleri: 6 isim: ID, CD_GEOCODI, TIPO, dens_imov, alan_m, ikametgah1 dk değerleri: 35464, 290110605000001, RURAL, 0.00000003,100004, 1.0000 maks. Değer: 58468, 293320820000042, URBANO, 0.54581673,99996, 99.0000

Setor baskısı resim açıklamasını buraya girin


Setor ve r.raster özetleri gönderebilir misiniz? Setordaki nesnelerin sayısı ve r.raster'ın boyutları hakkında biraz fikir sahibi olmak istiyorum. sadece onları yazdırmak iyi
mdsumner

Sorguya özet koydum.
Diogo Caribé

Özet değil, sadece yazdırın - bizim için sorduğum bilgi tgere değil
mdsumner

Üzgünüm, baskıyı ben koydum.
Diogo Caribé

Ah, çıktıyı görene kadar bunu düşünmedim hayal kırıklığına uğrattı - raster projeksiyon çokgenler ile eşleştiğinden emin olun, şu anda değil - r <- raster (setor) deneyin; res (r) <- 10; setor.r = rasterize (setor, r, 'dens_imov') - ama aynı zamanda deneyin, res (r) <- 250 ayarını yapın, böylece yüksek çözünürlüklü sürümün ne kadar süreceği hakkında bir fikir edinebilirsiniz
mdsumner

Yanıtlar:


17

Paketi bu şekilde kullanarak işlevi "paralelleştirmeye" çalıştım :rasterizeRparallel

  1. SpatialPolygonsDataFrame nesnesini nparçalara bölme
  2. rasterize her bölüm ayrı ayrı
  3. tüm parçaları tek bir rasterde birleştir

Bilgisayarımda, paralelleştirilmiş rasterizeişlev , paralelleştirilmemiş işlevden 2.75 kat daha az sürdü rasterize.

Not: Aşağıdaki kod, web'den bir çokgen şekil dosyasını (~ 26.2 MB) indirir. Herhangi bir SpatialPolygonDataFrame nesnesini kullanabilirsiniz. Bu sadece bir örnek.

Kitaplıkları ve örnek verileri yükleyin:

# 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

Şekil 1: Brezilya SpatialPolygonsDataFrame grafiği

Basit iş parçacığı örneği

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

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

Dizüstü bilgisayarımdaki zaman:

# Output:
# user  system elapsed 
# 23.883    0.010   23.891

Çok iş parçacığı örneği

# 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

Şekil 2: Brezilya Raster grafiği

Dizüstü bilgisayarımdaki zaman:

# Output:
# user  system elapsed 
# 0.203   0.033   8.688 

R'de paralelleştirme hakkında daha fazla bilgi :


Çok iyi cevap!
Diogo Caribé

N'yi yalnızca makinedeki çekirdek sayısı olarak ayarlamıyor musunuz?
Sam

@Sam bence sorunsuz çalışmalı ama daha iyi olup olmadığını bilmiyorum! Ben splitted eğer farz özellikleri de n bölümlerine eşit çekirdek sayısı belki bu parçalarından biri süreci ve kullanılmadan olacağını işlenen çekirdeğe daha kolay olabilir! Bununla birlikte, bir çekirdek bir parçayı işlerken çekirdeklerden daha fazla parçanız varsa, diğer kısmı alır. Ama kesinlikle, emin değilim! Bu konuda herhangi bir yardım takdir edilecektir.
Guzmán

bu gece bazı testler yapacağım. 50 metreye rasterleştirilen küçük bir şekil dosyasında (kabaca 25km x 25km), n = 20, 30 veya 50'ye kadar n = 2,4 veya 8 kullanımında küçük bir iyileşme var. Bu gece çok büyük bir şekil dosyasına gireceğim ve 25 metreye kadar rasterleştirin. Tek çekirdekli işleme 10 saattir, bu yüzden n'nin farklı değerlerini göreceğiz! (n = 50, 1 saatin biraz altındadır)
Sam

@ Guzmán Ben kodu tekrar çalıştırıyorum. Ancak, bazı hatalar geri döndü ve neden bilmiyorum. Bana yardımcı olabilir misiniz? CheckForRemoteErrors (val) hatası: 7 düğüm hata üretti; ilk hata: 'BRA_adm2' nesnesi bulunamadı
Diogo Caribé
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.