2017-02-28 95 views
1

我有四個相當巨大的RasterStack,並且想對它們做一些簡單的計算。我如何加快這些計算?我發現this approach using overlay(),但計算仍然很長。如何加速使用巨大柵格堆棧的計算?

我RasterStacks(S1,S2,S3,S4)擁有所有的尺寸:26, 76, 1976, 3805 (nrow, ncol, ncell, nlayers)和我當前的代碼看起來是這樣的:

out <- overlay(s1,s2,s3,s4, fun = function(rs1,rs2,rs3,rs4) {return((rs1+rs2-rs3-rs4)*1e3)}) 

任何想法?

編輯:爲了產生RasterStack(例如,S1),你可以調用下面的函數:

create_stack <- function(num.col,num.row,num.lay){ 
    r <- raster(matrix(runif(num.row*num.col,0,10), ncol=num.col, nrow=num.row), 
     xmn=0, xmx=num.col, ymn=0, ymx=num.row) 
    ll <- replicate(num.lay , r) 
    return(stack(ll)) 
} 

library(raster) 
s1 <- create_stack(76,26,3805) 
+0

請提供[reproducible](http://stackoverflow.com/q/5963269/3250126)示例。 – loki

+0

您可能想嘗試使用'ff'軟件包將RasterStacks轉換爲大3維的數組,然後對其進行計算。 ff軟件包在計算上效率更高,但是從'raster'到'ff'轉回''raster'也可能需要一些時間。 – Bastien

回答

1

在您的具體問題

out <- (s1 + s2 - s3 - s4) * 1e3 

似乎以應用功能的最快方法。

但是對於其他問題,您應該看看clusterR()函數。它允許你應用並行化的函數。

「舉個例子,它的工作原理與,它也與覆蓋 只要你提供一個RasterStack或RasterBrick作爲第一個參數的作品。」

隨着你的函數創建該工作示例:

create_stack <- function(num.col,num.row,num.lay){ 
    r <- raster(matrix(runif(num.row*num.col,0,10), ncol=num.col, nrow=num.row), 
       xmn=0, xmx=num.col, ymn=0, ymx=num.row) 
    ll <- replicate(num.lay , r) 
    return(stack(ll)) 
} 


library(raster) 
s1 <- create_stack(76,26,3805) 
s2 <- create_stack(76,26,3805) 
s3 <- create_stack(76,26,3805) 
s4 <- create_stack(76,26,3805) 


beginCluster() 
out <- clusterR(s1, fun = function(x,s2,s3,s4) {return((x + s2 - s3 - s4)*1e3)}, 
       args = list(s2 = s2, s3 = s3, s4 = s4), progress = "text") 
endCluster() 

作爲一個提示在一般情況下,我經歷了調用

beginCluster() 
raster

在段的開始許多光柵計算可能帶來未知的好處,因爲許多raster函數已經用於並行計算。

+0

謝謝。我添加了一個函數來重現我的維度的rasterstacks。不幸的是,我無法讓你的代碼運行。這個問題可能與[這個問題]有關(http://stackoverflow.com/questions/35369137/clusterr-with-multiple-raster-stacks)?! – moremo

+0

謝謝,現在你的代碼正在運行。如果你獲得了性能提升,你是否停止了跑步時間?我測試了它只有100層,並得到了我原來的方法這些措施:'用戶:81.791系統:0.68過去了:84.40'。在代碼中使用4個節點我得到了'0.125系統:0.018過去了:95.32'。根據[這個答案](http:// stackoverflow。com/questions/18654497/mclapply-user-time-large-elapsed-time)'用戶'時間應該是所有節點的總和,但是在哪裏呢,你的方法所花的時間越長呢? – moremo

+0

根據[這裏](http://stackoverflow.com/questions/13688840/what-c​​aused-my-elapsed-time-much-longer-than-user-time)讀取和寫入磁盤(光柵tmpdir)可能是問題。 – moremo

2

在處理大型柵格時,增加chuncksize會有很大幫助。另外我建議把所有的臨時文件放在一個可以輕鬆管理的目錄中。

library(raster) 
rasterOptions(tmpdir="C:\\",tmptime = 24,progress="text",timer=TRUE,overwrite = T,chunksize=2e+08,maxmemory=1e+8) 
+0

感謝您的評論和您給出的rasterOptions設置!根據你的評論,我在我的.R檔案中改變了我的rasterOptions,但到目前爲止,我還沒有觀察到巨大的性能增益...... – moremo

+0

你也可以嘗試'parallel processing',同時保持'chunksize'。就我而言,僅僅增加'chunksize'就能將處理時間縮短一半。 –