R(windows)中大栅格的并行处理

时间:2016-02-29 12:56:34

标签: r parallel-processing raster snow mclapply

我正在使用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

据我所知,由于栅格很大,它们会保存在磁盘上的临时文件中。当我关闭雪群时,无法再访问这些文件。

所以我的问题是,如何在群集关闭后访问数据?我可以继续使用这种方法吗?

谢谢!

2 个答案:

答案 0 :(得分: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 *对象作为第一个参数并且逐个单元地运行的函数(即,没有neigboring单元格的影响)并返回具有相同数量的单元格的对象。输入栅格对象。调用函数的第一个参数必须是Raster *对象。只能有一个Raster *对象参数。例如,它与calc一起使用,只要你提供一个RasterStack或RasterBrick作为第一个参数,它也可以与overlay一起使用。

答案 1 :(得分:1)

在R中的群集内运行栅格化功能时,我遇到了这个问题。

所有测试都运行得很好但是当我升级到非常大而精细的分辨率栅格时,我反复得到关于我在计算机上找不到的临时文件的错误。列表对象,我需要合并并写为1个栅格,在R中,但我无能为力。

在群集运行时观察临时文件目录后,我注意到关闭群集会自动删除所有创建的临时文件,所以我不得不在群集中执行merge和writeRaster函数,否则会失败与你的错误类似。