2016-11-10 46 views
6

Mam aplikację R współdziałającą z demonem Java poprzez stdin i stdout w nieskończonej pętli, która wydaje się mieć pewne wycieki pamięci. Uproszczona aplikacja R:Wyciek pamięci przy zamkniętych połączeniach

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

Ta pętla kończy się przy użyciu więcej i więcej pamięci RAM, a nawet gdybym ręcznie gc() po wywołaniu close(con), ślad pamięci wydaje się być OK na chwilę, ale w końcu zawsze rośnie.

podstawowy skrypt, aby to potwierdzić:

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()}" 

Ten rozpocznie dwa procesy R: jedno pismo do stdout a drugi odczyt z stdin połączony z rurą (a drugi drukowanie pid, dzięki czemu można monitorować związane zużycie pamięci):

enter image description here

nie jestem pewien, co robię źle, ale chciałbym, aby zatrzymać ten przeciek pamięci, więc każda pomoc jest bardzo ceniona.

+0

Jeśli ktoś interesuje się dyskusją, pytanie uzyskało więcej trakcji na [R-devel] (https://stat.ethz.ch/pipermail/r-devel/2016-November/thread.html#73360) – daroczig

Odpowiedz

2

Rzeczywiście (o przeczytaniu o tym pod numerem R-devel); w szczególności, wyciek pamięci został podłączony do wersji rozwojowej R, dzięki łatce autorstwa Gabora Csardi.

+0

bardzo, @ martin-mächler! – daroczig

+0

Myślę, że to sugeruje, że R 3.3.3+ powinno być załatane. –

+0

Łatka dokonała tego w następnej (od listopada 2016) wersji R, która była wersją 3.4.0. 3.4.2 jest aktualny (od 2 dni!). Nie przypisujemy poprawek: aby to zrobić naprawdę bezpiecznie, może być dużo pracy, do której nie mamy zasobów (= czasu ludzkiego). ((i chcielibyśmy, aby "wszyscy" uaktualnili do najnowszych wersji, jeśli to możliwe :-)) –