[英]Parallel processing and for loop in R
我有大量的 netcdf 文件。 每個是300*300=90000個網格。
我嘗試在循環中打開每個文件,將所有 90000 個網格設為一列,打開下一個文件並將其附加到第一列等。因此我創建了一個數據框,其中每列代表一個具有 90000 行的 netcdf 文件。
代碼如下。
files= list.files("C:/cygwin64/home/Suchi",pattern="3B-HHR.MS.MRG.3IMERG.2001",full.names=TRUE)
# Loop over files
for(i in 1:files) {
nc = ncdf4::nc_open(files[i])
lw = ncvar_get(nc,"pcp")
lw<-as.data.frame((lw))
lw<-as.data.frame(t(lw))
lw<-unlist((lw))
lw<-data.frame(lw)
# Add the values from each file to a single data.frame
cbind(df,data.frame(lw))->df
ncdf4::nc_close(nc)
}
上面的代碼工作正常。 這只是花費了太多時間。 請幫助我在並行處理中使用 foreach 命令做同樣的事情。 我收到以下錯誤:
Error unlist(ncdf4::nc_open(files[i])) :
task 1 failed - "missing value where TRUE/FALSE needed"
使用foreach
並行處理時..
我沒有看到你的 foreach 循環,所以我為你做了一個。 您收到的錯誤可能是由於您的循環是這樣的:
for(i in 1:files)
這是錯誤的,因為文件是向量而不是數字。 應該是這樣的:
for(i in 1:length(files))
這是我為您的腳本創建的 foreach 循環。 讓我知道這個是否奏效:
library(parallel)
library(doParallel)
library(foreach)
files= list.files("C:/cygwin64/home/Suchi",pattern="3B-HHR.MS.MRG.3IMERG.2001",full.names=TRUE)
# Loop over files
cl = makeCluster(10)
registerDoParallel(cl)
foreach(i = 1:length(files)) %dopar% {
library(ncdf4)
nc = ncdf4::nc_open(files[i])
lw = ncvar_get(nc,"pcp")
lw<-as.data.frame((lw))
lw<-as.data.frame(t(lw))
lw<-unlist((lw))
lw<-data.frame(lw)
# Add the values from each file to a single data.frame
cbind(df,data.frame(lw))->df
ncdf4::nc_close(nc)
}
stopCluster(cl)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.