我在 R 中使用 doMPI来并行保存netCDF气候数据。该数据以 4 维矩阵的形式存储在 R 中m
,其中包含 6 个变量的数据,在 20000 个时间点,在一个纬度和经度网格上。m
因此被索引为m[lon,lat,time,variable]
。根据 netCDF 将其数据存储在磁盘上的方式,将数据写入磁盘的最有效方式是按时间片。因此,我想m
为每个变量一次迭代一个时间片。目前,我的代码如下所示:
ntime <- 20000
output.vars <- list("rainfall", "snowfallwateq", "snowmelt", "newsnow", "snowdepth", "swe")
for (var.index in seq_along(output.vars)) {
ncout <- nc_open(output.files[var.index], write=TRUE)
val <- foreach(time.index=1:ntime, .packages=c("ncdf4")) %dopar%
{
ncvar_put(ncout, output.vars[[var.index]],
vals=m[,,time.index,var.index],
start=c(1, 1, time.index),
count=c(nlon, nlat, 1))
}
nc_close(ncout)
}
这不必要地将整个m
矩阵复制到每个工人。这占用了大量的内存,我需要减少复制的数据量。我从这个答案中想到的是我可以迭代矩阵的每个时间片,因此每次迭代时只有时间片的数据被复制到每个工作人员。该foreach
构造允许多个对象同时迭代,因此我什至可以将时间索引与矩阵时间片放在一起而不会出现问题。不幸的是,我不知道有任何方法可以按时间片迭代矩阵。有没有办法做到这一点,这样在变量循环的每次迭代t
中,我都可以有一个保存二维矩阵的变量?foreach
var
data
m[,,t,var]
我已经尝试过下面的直观方法,但它会遍历每个单独的元素,而不是一次遍历整个时间片。
val <- foreach(time.index=1:ntime, slice=m[,,,var], ...