我的R有内存泄漏?

我的R有内存泄漏?,r,memory-leaks,rcpp,R,Memory Leaks,Rcpp,我在Ubuntu 12.04(精确)64位上使用R2.15.3。 如果我在valgrind中运行R: 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

我在Ubuntu 12.04(精确)64位上使用R2.15.3。 如果我在valgrind中运行R:

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++函数时, 这可能是原因吗?


谢谢

您可能误读了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()
调用

此外,在我的“带R的HPC简介”幻灯片中,我有一个CRAN软件包早期版本中实际泄漏的工作示例。如果出现泄漏,这会有所帮助。如果没有,就很难看穿噪音


所以简而言之,如果你的代码崩溃了,那很可能是你的代码的错误。请尝试一个可重复性最低的示例,这是(好的)标准建议。

谢谢!我发现valgrind的输出非常混乱。我开始怀疑是否存在泄漏,因为如果我在R循环中迭代调用此函数,那么仅仅调用一个Rcpp函数,例如:numerimatrix myMat(int-nCols,int-nRows){numerimatrix out(nRows,nCols);return-out;}偶尔会导致R与segfault崩溃:for(ii in 1:10^6)mat如果可以重现segfault,也许在
gdb
下运行,那么我们就有可能改进。否则,这几乎是不可能的。你是对的,如果我设法重现错误,我会在另一个问题中发布它。谢谢,也请考虑RCPP DEVALL列表以寻求帮助。