我在64位Ubuntu 12.04(精确)上使用R 2.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软件包中实际泄漏的实际示例。如果有泄漏,这会有所帮助。如果不存在,则很难看清噪音。
简而言之,如果代码崩溃,则可能是代码的错误。尝试一个最小的可重复示例是(好的)标准建议。