2017-02-28 24 views
1

私は4つの非常に巨大なRasterStacksを持っていて、簡単な計算をしたいと思っています。これらの計算をどのように高速化できますか?私は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)}) 

任意のアイデア?

EDIT: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'パッケージを使ってRasterStackを大きな3次元配列に変換し、その代わりに計算を行うことができます。 ffパッケージは計算を行う方が効率的ですが、 'raster'から' ff'への転送を 'raster'に戻すには時間がかかるかもしれません。 – Bastien

答えて

1

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

は、あなたの関数を適用する最速の方法であると思われます。

しかし、他の問題については、clusterR()の機能を調べる必要があります。並列化された関数を適用することができます。

「例えば、それは、カルクで動作し、それはまた、限り、あなたは最初の引数として単一RasterStackまたはRasterBrickを提供してオーバーレイ で動作します。」あなたの機能で

私は、この実施例の作成:一般的に1つの先端のよう

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() 

を、私はセグメントの先頭にrasterパッケージから

beginCluster() 

を呼び出すことを経験しましたrasterの多くの関数が並列計算のために既に実装されているので、多くのラスタ計算では未知の利点が得られます。

+0

ありがとうございます。私は自分の次元のラスタスタックを再現する関数を追加しました。残念ながら、私はあなたのコードを実行することはできません。この問題は[この質問](http://stackoverflow.com/questions/35369137/clusterr-with-multiple-raster-stacks)に関連している可能性があります。 – moremo

+0

ありがとうございました。コードが実行されました。あなたがパフォーマンスを得るなら、あなたのランニングタイムを止めましたか?私は単なる100の層でそれをテストし、私の元のアプローチのための手段を得ました: 'user:81.791 system:0.68 elapsed:84.40'。あなたのコードで4つのノードを使って、私は '0.125 system:0.018 elapsed:95.32'を得ました。 [この回答](http:// stackoverflow。user/time-greater-than-elapsed-time) 'user'時間はすべてのノードの合計でなければなりませんが、あなたのアプローチではより長い' elapsed'時間はどこから来ますか? – 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設定をありがとう!あなたのコメントに応じて自分の.Rprofile内の自分のrasterOptionsを変更しましたが、これまでのところ大きなパフォーマンスの向上は見られませんでした。 – moremo

+0

'chunkksize 'を保ったままで'並列処理 'を試みることもできます。私の場合、「チャンクサイズ」を増やすだけで処理時間が半減しました。 –

関連する問題