我正在嘗試在 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)
但它不起作用。有誰知道問題出在哪里?非常感謝。
uj5u.com熱心網友回復:
您不能分配值從里面一個%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().
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/352912.html
