R - foreach с% dopar% не освобождает память, когда рабочий закончил - PullRequest
2 голосов
/ 30 апреля 2020

Я использую R с R cpp для выполнения дорогостоящих вычислений, которые также требуют много оперативной памяти. Поскольку я часто делаю это для разных параметров, я хочу рассчитать их параллельно. Для этого я использую пакеты foreach и doParallel. Моя проблема в том, что, как только рабочий поток завершает работу, кажется, что он не освобождает ОЗУ. Например, если я использую 7 ядер и хочу сканировать 9 параметров, я получаю примерно следующее поведение: enter image description here

Вы видите, что скачок в памяти примерно одинаков для двух темы 8 и 9, как это для семи потоков 1-7. Только после 8 и 9 память кажется освобожденной.

Мой минимальный рабочий пример в R:

library(minpack.lm)
library(Rcpp)
library(myRcppPackage)
library(foreach)
library(doParallel)

myParameters <- c(1:9)

# setup parallel backend
cores=detectCores()
close( file( "./monitorfile.txt", open="w" ) ) # flush the monitor-file
cl <- makeCluster(cores[1]-1, outfile="./monitorfile.txt")
registerDoParallel(cl)

clusterExport(cl, list("performCppLoop"), envir = environment())

myResult <- foreach(i=1:length(myParameters), .combine=rbind) %dopar% {

  # perform C++ loop with my parameters
  myData <- performCppLoop(myParameters[i])

  # do some stuff with myData
  cbind(mean(myData[,1]), mean(myData[,2]), mean(myData[,3]))  

  rm(myData)
} 

stopCluster(cl)


MWE C ​​++ код:

  // [[Rcpp::export]]
NumericMatrix performLoop(double myParameter){

    const number_of_steps = 20000000;

     // ps for phase space
    NumericMatrix data(number_of_steps, 3);

    for (unsigned long int i = 0; i <number_of_steps; i++) {
        // just some dummy calculations
        data(i, 0) = sqrt(myParameter);
        data(i, 1) = myParameter*2.0;
        data(i, 2) = myParameter/2.0;
    } 

    return data;
}

Что я делать неправильно?

...