2016-11-10 42 views
6

Tôi có ứng dụng R tương tác với một daemon Java qua stdinstdout 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):

enter image description here

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.

+0

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

Trả lời

2

Thật vậy (về việc đọc về điều này trên R-devel); đáng chú ý, rò rỉ bộ nhớ hiện đã được cắm vào phiên bản phát triển của R, nhờ vào bản vá của Gabor Csardi.

+0

Cảm ơn bạn rất nhiều, @ martin-mächler! – daroczig

+0

Tôi nghĩ rằng điều này cho thấy rằng R 3.3.3+ nên được vá. –

+0

Bản vá được đưa vào bản phát hành R tiếp theo (từ tháng 11 năm 2016) đã được 3.4.0. 3.4.2 là hiện tại (kể từ 2 ngày trước!). Chúng tôi không backport bản vá lỗi: Để làm điều này thực sự an toàn có thể được rất nhiều công việc mà chúng tôi không có các nguồn lực (= thời gian của con người) cho. ((và chúng tôi muốn "mọi người" nâng cấp lên bản phát hành mới nhất nếu có thể :-)) –