r: zApply 并行计算
r: zApply in parallel computing
我需要将 rasterbrick 聚合成月值。通常,使用 raster
包中的 zApply
函数会很容易。但是,我有一个很大的 rasterbrick,这需要很长时间。
所以基本上,我想知道使用 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 包
您可以使用 foreach
和 doParallel
来实现您的结果。
您将需要:
- 用
detectCores()
检测你的CPU个核心数
- 初始化
DoParallel
以使用 CPU 内核和 registerDoParallel(numCores)
- 使用所需的 packages、任何 init 变量和 [=33= 的方法设置
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
中,但这绝对是使用 CDO
或 NCO
等外部应用程序更有益的一个例子(即快点)。特别是,您可以使用 CDO
运算符 monmean
或 monavg
以防您希望时间序列中每个月的平均值,或者您可以使用 ymonmean
如果你想要一年中每个月的单一平均值(即气候学)。
命令看起来像:
cdo monmean in.nc out.nc
cdo ymonmean in.nc out.nc
其中 in.nc 是您的 NetCDF 文件,out.nc 是命令生成的 NetCDF 文件。
如果您的文件被拆分,例如,每天一个文件,您可以考虑将所有文件连接在一起,例如:
cdo cat *_daily.nc daily_time_series.nc
我需要将 rasterbrick 聚合成月值。通常,使用 raster
包中的 zApply
函数会很容易。但是,我有一个很大的 rasterbrick,这需要很长时间。
所以基本上,我想知道使用 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 包
您可以使用 foreach
和 doParallel
来实现您的结果。
您将需要:
- 用
detectCores()
检测你的CPU个核心数
- 初始化
DoParallel
以使用 CPU 内核和registerDoParallel(numCores)
- 使用所需的 packages、任何 init 变量和 [=33= 的方法设置
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
中,但这绝对是使用 CDO
或 NCO
等外部应用程序更有益的一个例子(即快点)。特别是,您可以使用 CDO
运算符 monmean
或 monavg
以防您希望时间序列中每个月的平均值,或者您可以使用 ymonmean
如果你想要一年中每个月的单一平均值(即气候学)。
命令看起来像:
cdo monmean in.nc out.nc
cdo ymonmean in.nc out.nc
其中 in.nc 是您的 NetCDF 文件,out.nc 是命令生成的 NetCDF 文件。
如果您的文件被拆分,例如,每天一个文件,您可以考虑将所有文件连接在一起,例如:
cdo cat *_daily.nc daily_time_series.nc