8

私は doSNOW パッケージ、より具体的には parLapply 関数を使用して、大きなラスター データセット (OS: Windows x64) のリストに対して再分類 (およびその後の他の操作) を実行しています。

コードは、次の最小限の例に少し似ています。

library(raster)
library(doSNOW)

#create list containing test rasters

x <- raster(ncol=10980,nrow=10980) 
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

私が理解している限り、ラスターは非常に大きいため、ディスク上の一時ファイルに保存されます。雪のクラスターを閉じると、これらのファイルにアクセスできなくなります。

私の質問は、クラスターが閉じられた後にデータにアクセスするにはどうすればよいですか? この方法で続行できますか?

ありがとう!

4

2 に答える 2

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- 私はそれがで動作すると思いreclassifyます. ドキュメントから:

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

于 2016-03-01T16:38:46.803 に答える