【问题标题】:Parallel processing and for loop in RR中的并行处理和for循环
【发布时间】:2019-12-04 19:27:26
【问题描述】:

我有大量的 netcdf 文件。其中每一个是 300*300=90000 个网格。

我尝试循环打开每个文件,将所有 90000 个网格作为单列,打开下一个文件并将其附加到第一列等。因此我创建了一个数据框,其中每一列代表一个 netcdf 文件,其中包含 90000行。

代码如下。

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 命令提供建议,而不会看到您正在尝试的内容。
  • 性能缓慢的最可能原因是在循环内执行cbind 操作。这是一个巨大的内存消耗和妨碍性能。由于您知道最终数据帧的大小,因此一种非常简单的改进方法是在循环主体之外预分配一个空数据帧,然后根据需要更新列。示例:df&lt;-data.frame(x=numeric(length=100)); df[ , c(1:10)]&lt;-numeric(length=100)
  • 感谢您查看我的查询。能否请您看一下下面阿里扬先生提到的代码。我用的也是一样的。我还尝试了空数据框的预分配。但是并行处理会更有用,因为我将来需要为更多文件执行此操作..

标签: r for-loop parallel-processing


【解决方案1】:

我没有看到你的 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)

【讨论】:

  • 对不起,我只是在你的循环中查看了你的代码,这一行没有意义:cbind(df,data.frame(lw))->df,对于每个核心看起来你创建一个新的df。这是行不通的,因为每个核心都是独立的并且没有相互链接,所以一个核心的 df 对于另一个核心的 df 意味着其他的东西。这应该以不同的方式完成。如果您不介意您的 df 列不按文件顺序排列。我可以建议一种不同的方式。
  • Error in summary.connection(connection) : invalid connection ,是使用上述代码出现的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-12
  • 1970-01-01
  • 2017-09-06
  • 1970-01-01
  • 2015-09-13
  • 1970-01-01
相关资源
最近更新 更多