Tôi có ứng dụng R tương tác với một daemon Java qua stdin
và stdout
trong một vòng lặp vô hạn, dường như có một số rò rỉ bộ nhớ. ứng dụng R đơn giản:Rò rỉ bộ nhớ với các kết nối đã đóng
while (TRUE) {
con <- file('stdin', open = 'r', blocking = TRUE)
line <- scan(con, what = character(0), nlines = 1, quiet = TRUE)
close(con)
}
Vòng lặp này kết thúc sử dụng ngày càng nhiều RAM, và thậm chí nếu tôi tự gc()
sau close(con)
cuộc gọi, bộ nhớ có vẻ là OK cho một thời gian, nhưng cuối cùng phát triển mãi mãi.
Một kịch bản cơ bản để xác nhận điều này:
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()}"
này sẽ bắt đầu hai quá trình R: một văn bản cho stdout
và người kia đọc từ stdin
kết nối với một ống (và thứ hai in pid
để bạn có thể giám sát việc sử dụng bộ nhớ liên quan):
tôi không chắc chắn những gì tôi đang làm sai, nhưng rất thích dừng rò rỉ bộ nhớ này vì vậy bất kỳ sự giúp đỡ được đánh giá cao.
Nếu có ai quan tâm đến cuộc thảo luận, câu hỏi nhận được nhiều lực kéo hơn trên [R-devel] (https://stat.ethz.ch/pipermail/r-devel/2016-November/thread.html#73360) – daroczig