В цикле R foreach не хватает памяти в среде HPC - PullRequest
0 голосов
/ 19 декабря 2018

Я использую пакет foreach в R для обработки растровых файлов.

Приведенный ниже код R прекрасно работает локально (в Windows) при адаптации к 8-ядерному процессору, но не хватает памяти в HPCсреда с 48 ядрами.Среда HPC имеет гораздо больше доступной памяти (2 ТБ на все 48 ядер) по сравнению с моей локальной коробкой (32 ГБ), поэтому это не ограничивающий фактор.

Сдвиг памяти происходит по мере выполнения цикла foreach.Это медленно, но достаточно, чтобы в конечном итоге не хватило памяти.

Я попытался переключить параллельные пакеты (на doMC, doSNOW), добавить многочисленные вызовы сборки мусора и rm() больших объектов в конце каждой итерации, изменяя количество используемых ядер,а также немедленное удаление любых временных файлов.

Есть идеи о том, что может вызвать проблемы с моей памятью?

# Set Java memory maximum
options(java.parameters = "-Xmx39g")

library(sp)
library(raster)
library(dismo)
library(foreach)
library(doParallel)
library(rgdal)
library(rJava)

# Set directories  
relPath <- "E:/BIEN_Cactaceae/"
bufferDir <- "Data/Buffers"
climDir <- "Data/FutureClimate/"
outDir <- "Analyses/FutureRanges/"
modelDir <- "Analyses/MaxEnt/"
outfileDir <- "OutFiles/"
tempDir <- "E:/Tmp/"

# Set directory for raster temporary files
rasterOptions(tmpdir = tempDir)

# Search for models
models <- list.files(path = paste0(relPath, modelDir), pattern = "rda$")

# Set up cluster
cl <- makeCluster(48, type = "FORK", outfile = paste0(relPath, outfileDir, "predictFuture.txt"))
registerDoParallel(cl)

# Loop through species and predict current ranges
foreach(i = 1:length(models),
        .packages = c("sp", "raster", "dismo", "rgdal", "rJava"),
        .inorder = F) %dopar% {
  # Get taxon
  taxon <- strsplit(models[i], ".", fixed = T)[[1]][1]
  # Get buffer
  tmpBuffer <- readOGR(dsn = paste0(relPath, bufferDir), layer = paste0(taxon, "_buff"), verbose = F)
  # Get scenarios
  scenarios <- list.files(path = paste0(relPath, climDir), pattern = "tif$")
  # Get model
  load(paste0(relPath, modelDir, models[i]))
  # Loop over scenarios
  for (j in scenarios) {
    # Get scenario name
    tmpScenarioName <- strsplit(j, ".", fixed = T)[[1]][1]
    # Skip scenario if already processed
    if (!file.exists(paste0(relPath, outDir, taxon, "_", tmpScenarioName, ".tif"))) {
      # Read, crop, mask predictors
      print(paste0(taxon, " - ", tmpScenarioName, ": processing"))
      tmpScenarioStack <- raster::stack(paste0(relPath, climDir, j))
      preds <- raster::crop(tmpScenarioStack, tmpBuffer)
      preds <- raster::mask(preds, tmpBuffer)
      # Rename predictors
      tmpNames <- paste0(taxon, ".", 1:20)
      tmpNames <- gsub("-", ".", tmpNames, fixed = T)
      tmpNames <- gsub(" ", "_", tmpNames, fixed = T)
      names(preds) <- tmpNames
      # Predict with model
      prediction <- dismo::predict(model_all, preds, progress = "")
      # Export predictions
      writeRaster(prediction, paste0(relPath, outDir, taxon, "_", tmpScenarioName, ".tif"))
      removeTmpFiles(h = 2)
    }
  }
}

stopCluster(cl)
...