r: zПрименить в параллельных вычислениях

Мне нужно объединить растровые кирпичи в месячные значения. Обычно это было бы легко, используя функцию zApply из raster пакета. Тем не менее, у меня есть большой растровый кирпич, и это займет очень много времени.

В общем, мне интересно, было бы легко сделать это с некоторыми библиотеками, такими как parallel или clusterR но я понятия не имею, как распараллелить этот процесс

# create a random raster stack

library(raster)

lay <- stack()

for (i in 1:365){
  print(i)
  ras <- matrix(rnorm(500, mean = 21, sd = rnorm(21, 12, 4)))
  ras <- raster(ras)
  lay <- addLayer(lay, ras)
}

dats <- seq(as.Date(񟭀-01-01'), length.out = nlayers(lay), by = 'days')

lay <- setZ(lay, dats)

monthlies <- zApply(lay, by = format(dats,"%m"), fun = 'mean') # aggregate from daily to monthly.

Благодарность!

Всего 1 ответ


Используйте пакеты foraech и doParallel

Вы можете использовать foreach и doParallel для достижения вашего результата. Вам нужно будет:

  • Определите количество ядер вашего процессора с помощью detectCores()
  • Инициализируйте DoParallel для работы с ядрами вашего процессора с помощью registerDoParallel(numCores)
  • Настройте цикл foreach с необходимыми пакетами , любой переменной init и методом для объединения результатов.

Ваш код будет выглядеть так:

library(foreach)
library(doParallel)
library(raster)

lay <- stack()

## Loading required package: iterators

numCores <- detectCores()
registerDoParallel(numCores)  # use multicore, set to the number of our cores

lay <- foreach (i=1:365, .init = lay, .combine = addLayer , .packages = "raster") %dopar% {
  print(i)
  ras <- matrix(rnorm(500, mean = 21, sd = rnorm(21, 12, 4)))
  ras <- raster(ras)
}

dats <- seq(as.Date(񟭀-01-01'), length.out = nlayers(lay), by = 'days')
lay <- setZ(lay, dats)
monthlies <- zApply(lay, by = format(dats,"%m"), fun = 'mean') # aggregate from daily to monthly

# When you're done, clean up the cluster
stopImplicitCluster()

Измерение скорости улучшения

Вы можете проверить улучшение скорости с помощью System.time() . Вот мои результаты:

#Time with a standard for loop
system.time({
  for (i in 1:365){
    print(i)
    ras <- matrix(rnorm(500, mean = 21, sd = rnorm(21, 12, 4)))
    ras <- raster(ras)
    lay <- addLayer(lay, ras)
  }
})

user  system elapsed 
66.29    0.09   67.15 

#Testing foreach loop time
system.time({
  lay <- foreach (i=1:365, .init = lay, .combine = addLayer , .packages = "raster") %dopar% {
    print(i)
    ras <- matrix(rnorm(500, mean = 21, sd = rnorm(21, 12, 4)))
    ras <- raster(ras)
  }
})

user  system elapsed 
21.72    0.09   25.58

Как мы видим, с помощью этого метода произошло эффективное улучшение скорости.

Надеюсь это поможет.


Есть идеи?

10000