关闭连接的内存泄漏

Memory leak with closed connections

我有一个 R 应用程序在无限循环中通过 stdinstdout 与 Java 守护程序交互,这似乎有一些内存泄漏。简化的 R 应用程序:

while (TRUE) {
    con <- file('stdin', open = 'r', blocking = TRUE)
    line <- scan(con, what = character(0), nlines = 1, quiet = TRUE)
    close(con)
}

这个循环最终会使用越来越多的 RAM,即使我在 close(con) 调用后手动 gc(),内存占用似乎暂时还可以,但最终会永远增长。

确认这一点的基本脚本:

Rscript --vanilla -e "while(TRUE)cat(runif(1),'\n')" | Rscript --vanilla -e "cat(Sys.getpid(), '\n');while (TRUE) {con <- file('stdin', open = 'r', blocking = TRUE);line <- scan(con, what = character(0), nlines = 1, quiet = TRUE);close(con);gc()}"

这将启动两个 R 进程:一个写入 stdout,另一个从连接管道的 stdin 读取(第二个打印 pid,以便您可以监控相关的内存使用情况):

我不确定我做错了什么,但很想阻止这种内存泄漏,因此非常感谢您的帮助。

确实(关于在 R-devel 上阅读此内容); 值得注意的是,由于 Gabor Csardi 的补丁,R 的开发版本中现在已经修复了内存泄漏问题。