8

我正在使用 doSNOW 包,更具体地说是使用 parLapply 函数对大型栅格数据集(操作系统: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* 对象参数。例如,它可以与 calc 一起使用,也可以与 overlay 一起使用,只要您提供单个 RasterStack 或 RasterBrick 作为第一个参数。

于 2016-03-01T16:38:46.803 回答
1

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

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

在集群运行时查看临时文件目录后,我注意到关闭集群将自动删除所有创建的临时文件,因此我必须在集群内执行合并和 writeRaster 函数,否则它将因非常相似的错误而失败你的。

于 2017-01-23T09:25:24.170 回答