Утечка памяти в сторонней библиотеке в R - PullRequest
0 голосов
/ 16 мая 2018

В настоящее время я выполняю эксперимент по моделированию в R с использованием стороннего пакета (пакет iRF, но в принципе не имеет значения, что это за пакет), который, похоже, имеет утечку памяти. Небольшой пример, воспроизводящий проблему:

library(zeallot)
library(iRF)

simulate_data <- function() {
  X <- matrix(runif(300 * 50), nrow = 300)
  Y <- X[,1] + X[,2] + rnorm(nrow(X))
  return(list(X = X, Y = Y))
}

for(i in 1:10) {
  c(X, Y) %<-% simulate_data()
  fit <- iRF(X, Y)
  rm(fit)
  gc()
}

Это использует чуть более 1 Гб оперативной памяти. В рассматриваемом пакете используется скомпилированный код C, и, вероятно, там происходит утечка памяти; следовательно, я не могу прямо освободить память в R. Вопрос в следующем: есть ли способ обойти эту утечку памяти, не перезапуская мой сеанс R? Я не уверен, имеет ли это смысл (я неосведомленный статистик), но есть ли какой-нибудь способ уничтожить ядерное оружие? все в мире C, как если бы я сбросил сессию? Крайне неудобно, что если я хочу повторить эксперимент 1000 раз, мне придется перезагрузить R или не хватить памяти.

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Следуя совету @ r2evans, проблему можно обойти, используя parallel. Следующий код не страдает от утечки памяти:

library(zeallot)
library(iRF)
library(parallel)

simulate_data <- function() {
  X <- matrix(runif(300 * 50), nrow = 300)
  Y <- X[,1] + X[,2] + rnorm(nrow(X))
  return(list(X = X, Y = Y))
}

f <- function(i) {
  c(X, Y) %<-% simulate_data()
  return(iRF(X, Y))
}

for(i in 1:10) {
  cl <- makeCluster(1, "FORK")
  fit <- clusterApply(cl, 1, f)[[1]]
  stopCluster(cl)
}
0 голосов
/ 17 мая 2018

Если вы не можете исправить источник, тогда единственный вариант - это устранить проблему. Если расчеты можно разбить на более мелкие компоненты, у вас есть несколько вариантов

  1. рассчитать, что вы можете, сохранить в .rda файлах, перезапустить R, продолжить; или

  2. использует схему распараллеливания, такую ​​как future или parallel::parLapplyLB, чтобы распределить обработку в подчиненные сеансы R, захватить выходные данные и разрешить закрытие дочерних процессов.

...