关闭连接时的内存泄漏问题

6

我有一个使用stdin和stdout与Java守护进程交互的R应用程序,进入了一个无限循环,似乎存在一些内存泄漏问题。简化后的R应用程序:

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

这个循环最终会使用越来越多的内存,即使我在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以便您可以监视相关的内存使用情况):

enter image description here

我不确定我哪里做错了,但是任何帮助来阻止这个内存泄漏都非常感激。

如果有人对此讨论感兴趣,该问题在R-devel上得到了更多的关注。 - daroczig
1个回答

2

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


非常感谢您,@martin-mächler! - daroczig
我认为这意味着应该打补丁R 3.3.3+。 - pdb
1
该补丁已经被合并到下一个R版本(从2016年11月开始),即3.4.0版。目前最新版本为3.4.2(自两天前起!)。我们不会将补丁移植回旧版本:这样做确保安全需要大量的工作,而我们没有足够的资源(人力时间)来完成。我们希望“每个人”都能尽可能升级到最新版本 :-) - Martin Mächler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接