【问题标题】:Nested parallelized (foreach) R loop with condition带有条件的嵌套并行化(foreach)R循环
【发布时间】:2021-12-19 17:21:10
【问题描述】:

我正在尝试在 R 循环中实现一些并行化来处理大型光栅文件。我使用了一些非常有用的帖子,但无法使我的代码正常工作。

这是一个包含三个光栅文件的示例:

library(raster)

#Simulating rasters:

n.size <- 10

env1 <- raster(nrows=n.size, ncols=n.size, xmn=0, xmx=1, ymn=0, ymx=1)
v1 <- runif(ncell(env1)/2, min=0.5, max=1)
v2 <- runif(ncell(env1)/2, min=0, max=0.5)
values(env1) <- c(v1,v2)
env1[c(71:100)] <- NA

env2 <- raster(nrows=n.size, ncols=n.size, xmn=0, xmx=1, ymn=0, ymx=1)
v2 <- runif(ncell(env1)/2, min=0.7, max=1)
v1 <- runif(ncell(env1)/2, min=0, max=0.3)
values(env2) <- c(v1,v2)

env3 <- raster(nrows=n.size, ncols=n.size, xmn=0, xmx=1, ymn=0, ymx=1)
v2 <- runif(ncell(env3)/2, min=0.9, max=1)
v1 <- runif(ncell(env3)/2, min=0, max=0.1)
values(env3) <- c(v1,v2)

myStack <- stack(env1,env2,env3)

plot(myStack)

树状栅格具有相同的范围和维度,但第一个栅格有一些缺少数据的网格单元。我想将其他两个栅格中的对应单元格也设置为缺失数据。

在一个连续的、传统的循环中,我这样做

myStack.mod <- myStack

start.time <- Sys.time()
for (j in 2:length(names(myStack))) {
    for (i in 1:ncell(myStack[[1]])) {
        if (is.na(myStack[[1]][i])) {
            myStack.mod[[j]][i] <- NA
        }
    }
}
end.time <-   Sys.time() - start.time
end.time
plot(myStack.mod)

为了使其并行化,我尝试了以下方法:

cores=detectCores()
cl <- makeCluster(cores[1]-2) #not to overload your computer
registerDoParallel(cl)

myStack.mod <- myStack

start.time <- Sys.time()

foreach (j = 2:length(names(myStack))) %:%
    foreach(i = 1:ncell(myStack[[1]])) %dopar% {
        if (is.na(myStack[[1]][i])) {
            myStack.mod[[j]][i] <- NA
        }
    }
    
    

end.time <-   Sys.time() - start.time
end.time

stopCluster(cl)

plot(myStack.mod)

但它不起作用。有谁知道问题出在哪里?非常感谢。

【问题讨论】:

    标签: r for-loop foreach parallel-processing nested


    【解决方案1】:

    您不能从内部%dopar% { ... } 表达式赋值。相反,就像函数一样,您需要返回值,方法是显式调用 return(),或者将要返回的值放在表达式的最后。

    一个例子,

    y <- foreach(i = 1:3) %dopar% {
      sqrt(i)
    }
    

    你想要做的是这样的:

    y <- double(3)
    foreach(i = 1:3) %dopar% {
      y[i] <- sqrt(i)
    }
    

    但这确实起作用,而且从来没有打算起作用。基本上,foreach() 不是 for 循环,它更像是lapply()

    【讨论】:

    • 感谢 Henri 的澄清。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    • 2021-09-24
    • 2019-07-13
    • 2016-05-28
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多