簡體   English   中英

R中的並行處理和for循環

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM