cod*_*123 5 parallel-processing r function raster
我正在尝试通过hargreaves方法计算蒸发量package SPEI。这涉及使用最低温度 ( TMIN) 和最高温度 ( TMAX)。鉴于此Tmin,并行计算是我最好的选择,并且Tmax rasterstacks拥有500,000 cells and 100 layers each.
Hargreaves function取Tmin,Tmax并latitude在each grid作为输入。以下是我的第一个猜测如何解决这个问题:
library(SPEI)
# go parallel
library(parallel)
clust <- makeCluster(detectCores())
#har <- hargreaves(TMIN,TMAX,lat=37.6475) # get evaporation for a station.
Run Code Online (Sandbox Code Playgroud)
但是,我的数据是网格化的。
Tmin并且Tmax是名单中,每个数据帧Tmin,并Tmax有一个$latitude连接到它。在 中pet,k$d是 Tmin,k$d是 Tmax(也许我应该在petegfunction(k,y)而不是仅仅提供两个参数k?)
pet <- function(k) {
hargreaves(k$d,k$d, k$latitude, na.rm=TRUE)}
# Make library and function available to clust
clusterEvalQ(clust, library(SPEI))
clusterExport(clust, pet)
pet_list <- parLapply(clust, TMIN,TMAX, pet)
Run Code Online (Sandbox Code Playgroud)
parLapply只接受一个参数。我怎样才能通过Tmin和Tmax到parLapply?是不是我的宠物功能不对?
谢谢。
索引可用于引用全局定义的行data.frame。我在下面举一个例子。
library(SPEI)
library(parallel)
Run Code Online (Sandbox Code Playgroud)
定义测试列表。
Tmin <- list(aa = data.frame(a=1:30, b1=runif(30), b2=runif(30), latitude=runif(30)),
bb = data.frame(a=1:30, b1=runif(30), b2=runif(30), latitude=runif(30)))
Tmax <- list(aa = data.frame(a=1:30, b1=runif(30), b2=runif(30), latitude=runif(30)),
bb = data.frame(a=1:30, b1=runif(30), b2=runif(30), latitude=runif(30)))
Run Code Online (Sandbox Code Playgroud)
制作集群
clust <- makeCluster(2)
Run Code Online (Sandbox Code Playgroud)
这是重写的函数,但我们将在一个更简单的函数上测试它。
pet1 <- function(ind){
Tmin[[ind]]$a + Tmax[[ind]]$a
}
Run Code Online (Sandbox Code Playgroud)
调用SPEI库并将工作区中的所有内容发送到每个 CPU。这通常不是很好的形式,所以请原谅我。
clusterEvalQ(clust, library(SPEI))
clusterExport(clust, ls())
Run Code Online (Sandbox Code Playgroud)
运行parLapply函数
pet_test <- parLapply(clust, 1:length(Tmin), pet1)
Run Code Online (Sandbox Code Playgroud)
edit:编辑以考虑 Tmin 和 Tmax 列表。核心思想是相同的,即使用索引作为函数的一个参数pet,并从内部引用全局变量pet。