我目前正在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
或耗尽内存,这是非常不方便的。
答案 0 :(得分:1)
如果您无法修复源代码,那么您唯一的选择就是包含问题。如果计算可以分解为更小的组件,那么您有几个选项
计算你能做什么,保存到.rda
文件,重启R,继续;或
使用future
或parallel::parLapplyLB
等并行化方案将处理分配到从属R会话,捕获输出,并允许子进程关闭。
答案 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)
}