2016-02-29 12 views
8

私はdoSNOWパッケージ、より具体的にはparLapply関数を使用して大きなラスタデータセット(OS:Windows x64)のリストを再分類します。R(ウィンドウ)の大きなラスタの並列処理

コードは少しこの最小限の例のようになります。

library(raster) 
library(doSNOW) 

#create list containing test rasters 

x <- raster(ncol=10980,nrow=10900) 
x <- setValues(x,1:ncell(x)) 

list.x <- replicate(9 , x) 

#setting up cluster 

NumberOfCluster <- 8 
cl <- makeCluster(NumberOfCluster) 
registerDoSNOW(cl) 
junk <- clusterEvalQ(cl,library(raster)) 

#perform calculations on each raster 

list.x <- parLapply(cl,list.x,function(x) calc(x,function(x) { x * 10 })) 

#stop cluster 

stopCluster(cl) 

意図したとおりのコードが実際に動作します。この問題は、結果を進めたいときに発生します。ラスタはかなり大きいなので、それらがディスク上の一時ファイルに保存されている、私の知る限り理解されるように

> plot(list.x[[1]]) 
Error in file(fn, "rb") : cannot open the connection 
In addition: Warning message: 
In file(fn, "rb") : 
    cannot open file 'C:\Users\*****\AppData\Local\Temp\RtmpyKYdpY\raster\r_tmp_2016-02-29_133158_752_67867.gri': No such file or directory 

:私は、このエラーメッセージを受信して​​います。私が雪の群を閉じると、これらのファイルにもうアクセスすることはできません。

私の質問は、クラスタが閉じられたらどのようにデータにアクセスできますか?この方法を使用することができますか?

ありがとうございます!

答えて

1

R.

でクラスタ内のラスタライズfucntionを実行している間、私はすべてのテストが完全に働いたが、私は非常に大きなと細かい解像度のラスタをスケールアップするとき、私は繰り返し、その一時ファイルに関するエラーを得たこの正確な問題を抱えていました私は自分のコンピュータで見つけられませんでした。私がマージして1ラスタとして書く必要があったリストオブジェクトはRに入っていましたが、何もできませんでした。

クラスタが実行されている間に一時ファイルディレクトリを見た後、クラスタを閉じると作成されたすべての一時ファイルが自動的に削除されることに気付きましたので、クラスタ内でmergeおよびwriteRaster関数を実行する必要がありました。あなたと非常に似たエラーです。

+0

ありがとうサム!あなたがそれを考えるなら、それは実際にはかなり明白です...試してみて、魅力のように働きます。 – Val

3

あなたはcalc(または、例えば、reclassify)に、特定のファイル名を渡し、そしてあなたの関数がスタックに読み込まれるためのベクターとして、これらのファイル名を返すかもしれない:

ff <- parSapply(cl, list.x, function(x) { 
    calc(x, function(x) x*10, filename=f <- tempfile(fileext='.tif')) 
    f 
}) 

s <- stack(ff) 

しかし、また?clusterRを見て - Iそれがreclassifyで動作すると思われます。

この関数は、第1引数としてRaster *オブジェクトを持ち、セル単位で動作する(つまり、セルに隣接しないように作用する)関数でのみ機能し、入力ラスタオブジェクトと同じ数のセル。呼び出される関数の最初の引数は、Raster *オブジェクトでなければなりません。 Raster *オブジェクトの引数は1つだけです。たとえば、calcで動作し、最初の引数として単一のRasterStackまたはRasterBrickを指定している限り、オーバーレイでも動作します。

+0

まだ、私は、クラスタが閉じられた後にデータにアクセスしようとすると、Rは一時ファイルを見つけることができず、このエラーメッセージを返します: 'plot(s [[1]] .local( .Object、...): C:\ Users \ ****** \ AppData \ Local \ Temp \ Rtmpsh1u3n \ file1e482e517fd9.tif 'がファイルシステムに存在しません。 サポートされているデータセットとして認識されません – Val

+0

奇妙な - それは私のために働く。ファイルを永続的なパスに保存してみてください。 – jbaums

+0

ありがとうございます。私はClusterRをもう一度見ていくつもりですが...私はこれより早く動いたかもしれません。また、有望に見えるクラスタ機能を持つ[this](https://cran.r-project.org/web/packages/raster/vignettes/functions.pdf)が見つかりました。 – Val