この方法でパッケージを使用して関数を「並列化」しようとしました:rasterize
R
parallel
- 分割SpatialPolygonsDataFrameの中でオブジェクトを
n
パーツ
rasterize
部分ごとに
- すべてのパーツを1つのラスターにマージする
私のコンピューターでは、並列化されたrasterize
関数は、並列化されていない関数よりも2.75倍少なくなりましたrasterize
。
注:以下のコードは、Webからポリゴンシェープファイル(〜26.2 MB)をダウンロードします。任意のSpatialPolygonDataFrameオブジェクトを使用できます。これは単なる例です。
ライブラリとサンプルデータをロードします。
# 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
図1:ブラジルSpatialPolygonsDataFrameプロット
単純なスレッドの例
# Simple thread -----------------------------------------------------------
# Rasterize
system.time(BRA_adm2.r <- rasterize(BRA_adm2, r.raster, 'NAME_2'))
私のラップトップでの時間:
# Output:
# user system elapsed
# 23.883 0.010 23.891
マルチスレッドスレッドの例
# 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)
図2:ブラジルのラスタープロット
私のラップトップでの時間:
# Output:
# user system elapsed
# 0.203 0.033 8.688
Rでの並列化の詳細: