2013-05-03 63 views
9

我在Ubuntu 12.04(精确)64位上使用R 2.15.3。 如果我在Valgrind的运行R:我的R有内存泄漏?

[R -d “的valgrind” --vanilla

然后我用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文档。

如果你想看到泄漏,创建一个,例如,有这样的文件:

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

其保留记忆,甚至明确的R够不着的地方,然后退出。在这里,我们得到:

$ 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()呼叫。

此外,我有一个早期版本的CRAN软件包中的实际泄漏的工作示例,在我的'使用R'幻灯片集的HPC介绍'之一中。如果和当泄漏时,这有助于。没有时,很难看清噪音。

因此,简而言之,如果你编码崩溃,那很可能是你的代码的错。尝试一个最小可重现的例子是(好的)标准建议。

+0

谢谢!我发现valgrind的输出很混乱。我开始怀疑泄漏,因为只是调用一个Rcpp函数,例如: NumericMatrix myMat(int nCols,int nRows) NumericMatrix out(nRows,nCols); 退货; } 有时会导致R与segfault崩溃,如果我在R循环中迭代调用此函数: for(ii in 1:10^6)mat < - myMat(100,100) – 2013-05-03 15:52:06

+0

如果您可以重现段错误,也许可以在'gdb'下运行,那么我们可以改进一些东西。否则,这几乎是不可能的。 – 2013-05-03 16:36:21

+0

你是对的,如果我设法重现错误,我会在另一个问题中发布它。谢谢 – 2013-05-03 17:26:18