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)
}
このループは、より多くのRAMを使用して終わる、とさえ私は手動でgc()
close(con)
コールの後ならば、メモリフットプリントは、しばらくの間、OKのようですが、最終的に永遠に成長します。
これを確認するための基本的なスクリプト:
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()}"
これは、2つのRのプロセスを開始します:1個のstdout
への書き込みや配管に接続stdin
からの読み込み、他の(第二のpid
を印刷することができますように)関連のメモリ使用量を監視:
私は私が間違ってやっているかわからないんだけど、任意のヘルプは高く評価されるように、このメモリリークを停止するのが大好きです。
ディスカッションに興味のある方は、[R-devel](https://stat.ethz.ch/pipermail/r-devel/2016-November/thread.html#73360)の質問を受けてください – daroczig