Почему кригинг с использованием параллельной обработки все еще использует память и не использует мои процессоры? - PullRequest
1 голос
/ 01 мая 2019

У меня большой набор данных измерений по области. Я хочу интерполировать свои данные, используя кригинг по моей области исследования. Мой окончательный вывод должен быть растр / сетка. Мой компьютер имеет 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]])

Я просто не вижу, откуда может возникнуть ошибка. Я использовал код Гусмана как есть, так почему он не работает? Есть намеки?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...