2013-05-03 2 views
9

우분투 12.04 (정교함) 64 비트에서 R 2.15.3을 사용하고 있습니다. 내가 Valgrind의에서 R을 실행하는 경우 :내 R에 메모리 누수가 있습니까?

--vanilla

R -d "Valgrind의"나는 다음 Q()를 사용하여 프로그램을 종료하고 난 다음 리포트를 얻을 :

==7167== HEAP SUMMARY: 
==7167==  in use at exit: 28,239,464 bytes in 12,512 blocks 
==7167== total heap usage: 28,780 allocs, 16,268 frees, 46,316,337 bytes allocated 
==7167== 
==7167== LEAK SUMMARY: 
==7167== definitely lost: 120 bytes in 2 blocks 
==7167== indirectly lost: 480 bytes in 20 blocks 
==7167==  possibly lost: 0 bytes in 0 blocks 
==7167== still reachable: 28,238,864 bytes in 12,490 blocks 
==7167==   suppressed: 0 bytes in 0 blocks 
==7167== Rerun with --leak-check=full to see details of leaked memory 
==7167== 
==7167== For counts of detected and suppressed errors, rerun with: -v 
==7167== Use --track-origins=yes to see where uninitialised values come from 
==7167== ERROR SUMMARY: 385 errors from 5 contexts (suppressed: 2 from 2) 

최근 R 꽤 자주 충돌합니다. 특히 Rcpp를 통해 C++ 함수를 호출하면 이 이유 일 수 있습니까? 감사합니다.

답변

10

valgrind 출력을 잘못 읽었을 수 있습니다. R이 시스템으로서 꽤 잘 연구되면서, (명백한) 누설은 없을 것입니다. 그러나 R은 동적으로 유형화 된 언어이며 할당을 수행했습니다. "확실히 손실 : 120 바이트"는 본질적으로 측정 오류입니다 - valgrind 문서를 참조하십시오.

이 같은 파일, 예를 들어, 하나를 만들어, 누출을보고 싶다면 : 다음 R의 손이 닿지 않는 곳에도 명시 적으로 메모리를 보유하고

library(Rcpp) 
cppFunction('int leak(int N) {double *ptr = (double*) malloc(N*sizeof(double)); \ 
      return 0;}') 
leak(10000) 

가 종료됩니다. 여기에 우리가 얻습니다 :

$ R -d "valgrind" -f /tmp/leak.R 
[...] 
R> leak(10000) 
[1] 0 
R> 
==4479== 
==4479== HEAP SUMMARY: 
==4479==  in use at exit: 35,612,126 bytes in 15,998 blocks 
==4479== total heap usage: 47,607 allocs, 31,609 frees, 176,941,927 bytes allocated 
==4479== 
==4479== LEAK SUMMARY: 
==4479== definitely lost: 120 bytes in 2 blocks 
==4479== indirectly lost: 480 bytes in 20 blocks 
==4479==  possibly lost: 0 bytes in 0 blocks 
==4479== still reachable: 35,611,526 bytes in 15,976 blocks 
==4479==   suppressed: 0 bytes in 0 blocks 
==4479== Rerun with --leak-check=full to see details of leaked memory 
==4479== 
==4479== For counts of detected and suppressed errors, rerun with: -v 
==4479== Use --track-origins=yes to see where uninitialised values come from 
==4479== ERROR SUMMARY: 31 errors from 10 contexts (suppressed: 2 from 2) 
$ 

이제 누수가 조금 더 많습니다 (희망 사항만큼 쉽게 읽을 수는 없지만). 제안 된 플래그를 추가하면 결국 우리가 만든 malloc() 호출을 가리킬 것입니다.

또한 'HPC 소개 R'슬라이드 세트 중 하나에 CRAN 패키지의 이전 버전에서 실제 누수에 대한 작업 예제가 있습니다. 누출이있는 경우 도움이됩니다. 아무도 없을 때, 소음을 통해 보는 것이 더 어렵습니다.

즉, 코드를 잘못 작성하면 코드에 오류가있는 것입니다. 최소한의 재생산 가능한 예제를 사용해보십시오. (좋은) 표준 조언입니다.

+0

고마워요! 나는 valgrind 산출물이 매우 혼란 스럽다는 것을 알았습니다. 나는 다음과 같은 Rcpp 함수를 호출하기 때문에 누출에 대한 의문이 생기기 시작했습니다. NumericMatrix myMat (int nCols, int nRows) { NumericMatrix out (nRows, nCols); 반납; 이 함수를 R 루프에서 반복적으로 호출하면 segfault에서 R이 충돌하는 경우가 있습니다. (ii in 1 : 10^6) mat <- myMat (100, 100) –

+0

segfault를 재현 할 수있는 경우 , 그리고'gdb'에서 실행될 수 있다면 아마도 개선 될 수 있습니다. 그렇지 않으면 거의 불가능합니다. –

+0

맞습니다. 오류를 재현하면 다른 질문에 게시 할 것입니다. 감사합니다. –