如何在光栅包 R 中有效地并行化 EXTRACT 函数
How to efficiently parallelize EXTRACT function in raster package R
给定一个 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.
我的实际 rasterbrick 有 400,000 层
我不确定如何在不出现内存问题的情况下 运行 并行化此任务。
感谢您的所有建议。
您可以按照这些思路做一些事情来避免内存问题
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 文件有什么用。
给定一个 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.
我的实际 rasterbrick 有 400,000 层
我不确定如何在不出现内存问题的情况下 运行 并行化此任务。
感谢您的所有建议。
您可以按照这些思路做一些事情来避免内存问题
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 文件有什么用。