【发布时间】: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<-data.frame(x=numeric(length=100)); df[ , c(1:10)]<-numeric(length=100) -
感谢您查看我的查询。能否请您看一下下面阿里扬先生提到的代码。我用的也是一样的。我还尝试了空数据框的预分配。但是并行处理会更有用,因为我将来需要为更多文件执行此操作..
标签: r for-loop parallel-processing