В цикле R foreach не хватает памяти в среде HPC

Я использую пакет 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)

0 ответов

Другие вопросы по тегам