R 在光栅砖中循环

R 在光栅砖中循环,r,raster,r-raster,R,Raster,R Raster,我知道这里有很多关于光栅砖循环的问题,但是没有一个能提供我想要的答案/建议 我有一个很大的(17.2GB,7901层)netcdf文件,我已经将它作为RasterBrick导入了R > KK10Brick class : RasterBrick dimensions : 2160, 4320, 9331200, 7901 (nrow, ncol, ncell, nlayers) resolution : 0.08333333, 0.08333333 (x, y) ex

我知道这里有很多关于光栅砖循环的问题,但是没有一个能提供我想要的答案/建议

我有一个很大的(17.2GB,7901层)
netcdf
文件,我已经将它作为
RasterBrick
导入了
R

> KK10Brick
class       : RasterBrick 
dimensions  : 2160, 4320, 9331200, 7901  (nrow, ncol, ncell, nlayers)
resolution  : 0.08333333, 0.08333333  (x, y)
extent      : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 
data source : D:\LandUse\KK10.nc 
names       : X8000, X7999, X7998, X7997, X7996, X7995, X7994, X7993, X7992, X7991, X7990, X7989, X7988, X7987, X7986, ... 
z-value     : 100, 8000 (min, max)
varname     : land_use
文件中的每一层代表一年,我需要创建砖块中每个像素的时间移动平均值。尽管变量看起来是分类的(
土地使用
),但实际上它是一个%的覆盖率

我想创建一个30年移动平均线,带有10年滑动窗口。e、 g.第一个窗口将生成层
1:30
平均值的光栅,下一个窗口将生成层
11:40
平均值的另一个光栅。…
7871:7901

我认为for循环可能是实现这一点的最佳方式,但我不确定我是否走上了正确的道路

for (i in 1:7901){
subsetLayers <- code to subset relevant layers
out <- stackApply(KK10Brick, indices = subsetLayers, fun = "mean", na.rm = TRUE, filename = paste("./Output/", "meanLU_window_", i, ".tif", sep = ""))
rm(out)}

这应该适用于您的示例数据。我不确定它在速度和RAM使用方面是否能很好地扩展到非常大的netcdf数据-请告诉我它是否能在大数据上工作

starts = seq(1, nlayers(exBrick)-30, 10)
nout = length(starts)
out = brick(nrow = 180, ncol = 360, nl = nout)
values(out) = NA
crs(out) = "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0" 

for (i in 1:nout) {
  start = starts[i]
  out[[i]] = mean(exBrick[[start:(start+30)]]) 
}
如果RAM使用是分配一块大砖块来存储结果的限制因素,我们可以通过将每个结果层保存到磁盘(一次一个光栅),以一定的速度节省RAM:

for (i in starts) {
  out = mean(exBrick[[i:(i+30)]]) 
  writeRaster(out, filename=paste0("out",i,".grd"), overwrite=TRUE)
}

这应该适用于您的示例数据。我不确定它在速度和RAM使用方面是否能很好地扩展到非常大的netcdf数据-请告诉我它是否能在大数据上工作

starts = seq(1, nlayers(exBrick)-30, 10)
nout = length(starts)
out = brick(nrow = 180, ncol = 360, nl = nout)
values(out) = NA
crs(out) = "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0" 

for (i in 1:nout) {
  start = starts[i]
  out[[i]] = mean(exBrick[[start:(start+30)]]) 
}
如果RAM使用是分配一块大砖块来存储结果的限制因素,我们可以通过将每个结果层保存到磁盘(一次一个光栅),以一定的速度节省RAM:

for (i in starts) {
  out = mean(exBrick[[i:(i+30)]]) 
  writeRaster(out, filename=paste0("out",i,".grd"), overwrite=TRUE)
}

@dww我为示例光栅砖添加了一些代码。@dww我为示例光栅砖添加了一些代码。谢谢。将NA值分配到与我的真实数据集具有相同行/列/层数的光栅需要27.5GB RAM。我可以访问内存约为200GB的机器,所以我会在接下来的几天里告诉你它的运行情况。@KaanKaant我为结果分配的光栅砖只有原始数据层的十分之一。所以应该只小于3GB。我还添加了一个编辑,它还显示了如何通过一次保存一层结果来减少ram的使用。谢谢。将NA值分配到与我的真实数据集具有相同行/列/层数的光栅需要27.5GB RAM。我可以访问内存约为200GB的机器,所以我会在接下来的几天里告诉你它的运行情况。@KaanKaant我为结果分配的光栅砖只有原始数据层的十分之一。所以应该只小于3GB。我还添加了一个编辑,它还显示了如何通过一次保存一层结果来减少ram的使用。