2017-03-01 96 views
0

我知道這裏有大量的關於通過光柵磚循環的問題,但沒有一個提供了我期待的答案/建議。通過光柵磚循環

我有一個大的(17.2GB,7901圖層)netcdf文件,我已將其導入R,作爲RasterBrick

> 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 

文件中的每一層代表1年,我需要在磚創建的每個像素的時間移動平均值。即使這個變量似乎是絕對的(land_use),它實際上是一個%覆蓋率。

我想創建一個30年的移動平均線,有10年的滑動窗口。例如第一個窗口將產生來自圖層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)} 

我卡住的地方是編寫代碼來生成subsetLayers的序列。任何幫助將非常感激。

編輯。

library(raster) 
exBrick <- brick(nrow = 180, ncol = 360, nl = 100) 
values(exBrick) <- runif(ncell(exBrick) * nlayers(exBrick)) 
crs(exBrick) <- "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0" 
exBrick 
+0

@dww我在示例柵格磚的代碼中添加了一些代碼。 – KaanKaant

回答

1

這應該適用於您的示例數據。我不確定在速度和內存使用方面它會如何擴展到您的超大型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) 
} 
+0

謝謝你。將NA值分配給具有相同行數/列數/層數的柵格,因爲我的真實數據集需要27.5GB RAM。我有機會獲得200GB內存的機器,所以我會讓你知道在接下來的幾天內會如何。 – KaanKaant

+0

@KaanKaant我分配給結果的柵格磚只有原始數據層的十分之一。所以應該只有不到3GB。我還添加了一個編輯,該編輯還顯示瞭如何通過一次保存一層圖像來減少內存使用率。 – dww