Я использую R с R cpp для выполнения дорогостоящих вычислений, которые также требуют много оперативной памяти. Поскольку я часто делаю это для разных параметров, я хочу рассчитать их параллельно. Для этого я использую пакеты foreach
и doParallel
. Моя проблема в том, что, как только рабочий поток завершает работу, кажется, что он не освобождает ОЗУ. Например, если я использую 7 ядер и хочу сканировать 9 параметров, я получаю примерно следующее поведение:
Вы видите, что скачок в памяти примерно одинаков для двух темы 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;
}
Что я делать неправильно?