【发布时间】:2019-03-14 17:32:56
【问题描述】:
我在 R 中使用 doMPI 来并行保存 netCDF 气候数据。该数据存储在 R 中的 4 维矩阵 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 矩阵复制到每个工作人员。这占用了大量的内存,我需要减少复制的数据量。我对from this answer 的想法是我可以迭代矩阵的每个时间片,因此每次迭代时只有时间片的数据被复制到每个工作人员。 foreach 构造允许多个对象同时迭代,因此我什至可以将时间索引与矩阵时间片放在一起而不会出现问题。不幸的是,我不知道有任何方法可以按时间片迭代矩阵。有没有办法做到这一点,这样在foreach 循环变量var 的每次迭代t 中,我可以有一个变量data 保存二维矩阵m[,,t,var]?
我已经尝试过下面的直观方法,但它会遍历每个单独的元素,而不是一次遍历整个时间片。
val <- foreach(time.index=1:ntime, slice=m[,,,var], ...
【问题讨论】:
标签: r netcdf parallel-foreach dompi