如何有效并行化栅格数据包R中的EXTRACT函数

时间:2018-09-23 21:38:41

标签: r parallel-processing extract raster

鉴于netcdf文件,我试图提取所有像素以形成data.frame,以便以后导出到.csv

a=brick(mew.nc)
#get coordinates 
coord<-xyFromCell(a,1:ncell(a))

我可以使用extract(a,1:ncell(a))提取所有像素的数据。但是,我遇到了内存问题。

通读各种帮助页面后,我发现可以通过以下方法加快处理速度:

beginCluster(n=30)
b=extract(a, coord)
endCluster()

但是我仍然用光了内存。我们的超级计算机不止1000 nodes, each node has 32 cores.

我实际的光栅砖有40万层

我不确定如何在不遇到内存问题的情况下简化此任务。

感谢您的所有建议。

Sample data of ~8MB can be found here

1 个答案:

答案 0 :(得分:2)

您可以按照以下方式做一些事情,以避免出现内存问题

library(raster)
b <- brick(system.file("external/rlogo.grd", package="raster")) 

outfile <- 'out.csv'
if (file.exists(outfile)) file.remove(outfile)

tr <- blockSize(b)
b <- readStart(b)
for (i in 1:tr$n) {
    v <- getValues(b, row=tr$row[i], nrows=tr$nrows[i])
    write.table(v, outfile, sep = ",", row.names = FALSE, append = TRUE, col.names=!file.exists(outfile))
}
b <- readStop(b)

要并行化,您可以按层或成组进行此操作;并可能一步将所有值用于图层的每个子集。一次一次在这里:

f <- function(d) {
   filename <- extension(paste(names(d), collapse='-'), '.csv')
   x <- values(d)
   x <- matrix(x) # these two lines only needed when using
   colnames(x) <- names(d)  # a single layer
   write.csv(x, filename, row.names=FALSE)
}

# parallelize this:
for (i in 1:nlayers(b)) {
    f(b[[i]])
}

x <- sapply(1:nlayers(b), function(i) f(b[[i]]))

您应该使用extract。我的问题是,您想要这么大的csv文件。