R中第三方库中的内存泄漏

时间:2018-05-16 20:39:19

标签: r memory-leaks

我目前正在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()
}

这只使用超过1Gb的ram。有问题的软件包使用编译的C代码,可能是内存泄漏;因此,我无法直接释放R中的记忆。问题是:有没有办法绕过这个内存泄漏而不重新启动我的R会话?我不确定这是否有意义(我是一个无知的统计学家)但是有什么方法可以在C世界中核对所有内容,就好像我重置会话一样?如果我想复制实验1000次,我将不得不重新启动R或耗尽内存,这是非常不方便的。

2 个答案:

答案 0 :(得分:1)

如果您无法修复源代码,那么您唯一的选择就是包含问题。如果计算可以分解为更小的组件,那么您有几个选项

  1. 计算你能做什么,保存到.rda文件,重启R,继续;或

  2. 使用futureparallel::parLapplyLB等并行化方案将处理分配到从属R会话,捕获输出,并允许子进程关闭。

    < / LI>

答案 1 :(得分:1)

根据@ 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)
}