【问题标题】:Parallel processing of big rasters in R (windows)R(windows)中大栅格的并行处理
【发布时间】:2016-02-29 12:56:33
【问题描述】:

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

据我了解,由于栅格很大,因此它们保存在磁盘上的临时文件中。而当我关闭雪团时,这些文件就无法再访问了。

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

谢谢!

【问题讨论】:

    标签: r parallel-processing raster snow mclapply


    【解决方案1】:

    您可以将特定的文件名传递给 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 作为第一个参数。

    【讨论】:

    • 不过,当我在集群关闭后尝试访问数据时,R 无法找到临时文件并返回此错误消息:&gt; plot(s[[1]]) Error in .local(.Object, ...) : C:\Users\******\AppData\Local\Temp\Rtmpsh1u3n\file1e482e517fd9.tif' does not exist in the file system, and is not recognised as a supported dataset name.
    • 奇怪——它对我有用。也许尝试将文件保存到持久路径。
    • 谢谢。不过,我将再看一下 ClusterR……我可能已经从这个开始太快了。我还发现this 有一个看起来很有前途的集群功能。
    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢山姆!如果您想到它,它实际上是相当明显的......尝试并像魅力一样工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    相关资源
    最近更新 更多