2016-11-10 8 views
6

stdinstdoutを経由して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を印刷することができますように)関連のメモリ使用量を監視:

enter image description here

私は私が間違ってやっているかわからないんだけど、任意のヘルプは高く評価されるように、このメモリリークを停止するのが大好きです。

+0

ディスカッションに興味のある方は、[R-devel](https://stat.ethz.ch/pipermail/r-devel/2016-November/thread.html#73360)の質問を受けてください – daroczig

答えて

2

確かに(about about this on R-devel); 特に、Gabor Csardiのパッチのおかげで、メモリーリークがRの開発版に差し込まれました。

+0

ありがとうあなたは非常に、@ martin-mächler! – daroczig

+0

これは、R 3.3.3+にパッチを当てるべきだと考えています。 –

+0

このパッチは、3.4.0でリリースされたRリリースの次のリリースになりました。 3.4.2は最新です(2日前から!)。パッチをバックポートしないでください:これを行うには、実際にはリソース(=人間の時間)がない多くの作業が必要です。 ((もし可能であれば "みんな"が最新のリリースにアップグレードしてほしい:-)) –

関連する問題