关闭连接的内存泄漏
Memory leak with closed connections
我有一个 R 应用程序在无限循环中通过 stdin
和 stdout
与 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 的开发版本中现在已经修复了内存泄漏问题。
我有一个 R 应用程序在无限循环中通过 stdin
和 stdout
与 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 的开发版本中现在已经修复了内存泄漏问题。