光栅封装R中提取函数的高效并行化

光栅封装R中提取函数的高效并行化,r,parallel-processing,extract,raster,R,Parallel Processing,Extract,Raster,给定一个netcdf文件,我试图提取所有像素以形成一个data.frame,以便以后导出到.csv a=brick(mew.nc) #get coordinates coord<-xyFromCell(a,1:ncell(a)) 但我还是没有记性。我们的超级计算机有1000多个节点,每个节点有32个核。 我的实际rasterbrick有400000层 我不知道如何在不遇到内存问题的情况下并行化此任务 谢谢你的建议 您可以按照这些方法来避免内存问题 library(raster) b &

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

a=brick(mew.nc)
#get coordinates 
coord<-xyFromCell(a,1:ncell(a))
但我还是没有记性。我们的超级计算机有1000多个节点,每个节点有32个核。

我的实际rasterbrick有400000层

我不知道如何在不遇到内存问题的情况下并行化此任务

谢谢你的建议


您可以按照这些方法来避免内存问题

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)
库(光栅)

b如果您在没有并行化的情况下遇到内存问题,我不确定在几个内核中运行代码是否会缓解这个问题。可能恰恰相反。解决方案可能取决于您的最终目标,即400k层。@Roman,您说得对!但是,是否有一种方法可以一次提取一个层的数据,然后cbind输出?一位朋友需要数据,以便在
R
MATLAB
之外进行进一步处理。感谢您让我的工作更轻松。第一部分可能更合适,因为它生成一个
数据帧
,而并行部分生成的文件数量与层数相同。这将要求我导入
.csv
文件并生成
数据帧
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]]))