У меня большой набор данных измерений по области. Я хочу интерполировать свои данные, используя кригинг по моей области исследования. Мой окончательный вывод должен быть растр / сетка.
Мой компьютер имеет 8 Гб оперативной памяти и 4 ядра. Когда я пытаюсь использовать функцию предиката () с установленной вариограммой, память переполняется, и мой компьютер больше не отвечает. У меня есть возможность запускать мой код на нескольких ядрах (более 20!), Но мой код должен быть аккуратным и работать на небольшом подмножестве на моем персональном ноутбуке, прежде чем я смогу использовать его на всем своем наборе данных на суперкомпьютере.
Я пытался распараллелить функцию предсказания (), используя параллельный пакет, следуя сценарию, предоставленному Гусманом для ответа на вопрос Как добиться параллельного кригинга в R, чтобы ускорить процесс? . Тем не менее, у меня та же проблема, что и раньше, когда моя память используется по максимуму, а мои процессоры не используются.
Я пытался уменьшить свой набор данных с меньшим количеством точек данных и меньшей сеткой, чтобы протестировать мой код, но он все еще не работал (используя всю память и постоянно тратя на вычисления).
Мои данные - это SpatialPointsDataFrame с некоторыми измерениями Cu (ppm).
Вот мой код:
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]])
Я просто не вижу, откуда может возникнуть ошибка. Я использовал код Гусмана как есть, так почему он не работает? Есть намеки?