gpt4 book ai didi

r: zApply 在并行计算中

转载 作者:行者123 更新时间:2023-12-01 02:35:08 25 4
gpt4 key购买 nike

我需要将 rasterbrick 聚合成每月的值。通常,这很容易使用 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('2000-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.

谢谢!

最佳答案

使用 foraech 和 doParallel 包

您可以使用 foreachdoParallel达到你的结果。
您将需要:

  • 使用 detectCores() 检测您的 CPU 内核数
  • 初始化 DoParallel使用 registerDoParallel(numCores) 使用您的 CPU 内核
  • 设置 foreach循环所需的 包裹 , 任何 初始化 变量,以及 的方法联合 结果。

  • 您的代码将如下所示:
    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('2000-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

    正如我们所看到的,使用这种方法可以有效地提高速度。

    希望这可以帮助。

    关于r: zApply 在并行计算中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59765510/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com