1

我有一个区域的大型测量数据集。我想在我的研究区域上使用克里金法插入我的数据。我的最终输出应该是栅格/网格。我的电脑有 8Gb RAM 和 4 个内核。当我尝试将 predict() 与拟合的变异函数一起使用时,我的内存已满,我的电脑不再响应。我有可能在多个内核(超过 20 个!)上运行我的代码,但我的代码需要整理并在我的个人笔记本电脑上处理一个较小的子集,然后才能在超级计算机上的整个数据集上使用它。

我尝试按照 Guzmán 提供的脚本使用并行包来并行化 predict() 函数,以回答如何在 R 中实现并行克里金法以加快进程?. 但是,我遇到了和以前一样的问题,我的内存被最大限度地使用而我的处理器没有被使用。我试图减少更少数据点和更小的网格的数据集,以测试我的代码,但它仍然没有工作(使用所有内存并永远进行计算)。

我的数据是带有一些 Cu(ppm) 测量值的 SpatialPointsDataFrame。

这是我的代码:

library(tidyverse)
library(data.table)
library(sp)
library(raster)
library(gstat)

# Data
head(sp.soil)

#   NAT_North NAT_East  NAT_RL Cu_ppm
# 1:   6281361 376058.9 1213.06     56
# 2:   6281545 376020.8 1211.19     52
# 3:   6281408 376073.1 1235.29    110
# 4:   6281326 376078.0 1225.85    116
# 5:   6281312 376122.3 1227.95     26
# 6:   6281302 376160.3 1231.50     60

# Grid
grd <- GridTopology(cellcentre.offset = c(box[1,1], box[2,1]),
                    cellsize = c(100,100),
                    cells.dim = c(15,12)) 
grd <- SpatialGrid(grd,
                   proj4string = proj)

## KRIGING
# Experimental semi-variogram
v.Cu <- variogram(gstat(formula = log10(Cu_ppm) ~ 1, data = sp.soil))

# Fit variogram model
fit.v.Cu <- fit.variogram(object = v.Cu, model = vgm(c("Sph","Exp")))

# Define the fitted geostatistical model
k.Cu <- gstat(formula = log10(Cu_ppm) ~ 1, data = sp.soil, model = fit.v.Cu) 

# Parallelization
library(parallel)

no_cores <- detectCores() - 1 

# Initiate cluster
cl <- makeCluster(no_cores)

parts.x <- split(1:grd@grid@cells.dim[2], f = 1:no_cores-1)
parts.y <- split(1:grd@grid@cells.dim[1], f = 1:no_cores-1)

clusterExport(cl = cl, varlist = c("grd", "k.Cu", "parts.x", "parts.y"), envir = .GlobalEnv)
clusterEvalQ(cl = cl, expr = c(library('sp'), library('gstat')))

parallelX <- parLapply(cl = cl,
                       X = 1:no_cores,
                       fun = function(x) predict(k.Cu, grd[parts.x[[x]], parts.y[[x]] ]) )

stopCluster(cl)

mergeParallelX <- maptools::spRbind(parallelX[[1]], parallelX[[2]])
mergeParallelX <- maptools::spRbind(mergeParallelX, parallelX[[3]])

我只是看不出错误可能来自哪里。我已经按原样使用了 Guzman 代码,为什么它不起作用?有什么提示吗?

4

0 回答 0