【问题标题】:Rcpp: how to monitor the memory usage of variables?rcpp:如何监控变量的内存使用情况?
【发布时间】:2021-11-01 13:33:25
【问题描述】:

我在Rcpp 中实现了一个 MCMC 算法。我发现程序的内存随着运行的迭代次数越来越多,最终会被Linux系统杀死(即“内存不足”错误)。

我想监控每个变量的内存使用情况来检测问题的原因。

我知道在R 中,这可以使用object.size() 来完成。 Rcpp 对应的是什么?

我试过sizeof(),它似乎显示的是一个常数(例如,16)。我是否正确,一旦声明了一个变量(例如,mat mat1=zeros<mat>(10,10);),这个变量使用的内存大小在程序运行期间不会改变(例如,mat1(0,0)=100000; 不会改变mat1 的大小? )?

如果我的上述理解是正确的,那么“内存不足”的问题就更让我费解了,因为我在程序中并没有改变变量的大小。我确定了一个计算密集型函数,该函数在每次迭代期间由主 MCMC 函数调用,并且可能是“内存不足”问题的原因。那么我的问题是为什么调用相同的函数会导致越来越高的内存使用量?有没有可能这个函数使用的一些内存没有被释放?如果是这种情况,我应该如何确认?

感谢任何帮助或建议!

【问题讨论】:

  • 公共仓库的链接会有所帮助。如果您评论对该函数的调用,您的记忆会增加吗?如果没有,那是你的功能吗?
  • 嗨@IñakiÚcar,谢谢。这是一个私人项目,所以我无法分享回购。函数是我写的。该函数用于进行一堆计算并返回单个值(双精度型)。而且,如果我注释掉这个函数。 “内存不足”问题消失了。这个函数的一些输入变量非常大,所以我对这些变量使用“通过引用(&)”,否则计算时间要长得多。 “通过引用传递”是否可能导致此问题?我还没有测试。
  • R 具有不错的内存分析功能。请参阅编写 R 扩展,当 Rcpp 创建 R 对象时,这适用。

标签: c++ r memory rcpp rcpparmadillo


【解决方案1】:

您可以简单地打开代码编辑器的内存管理区域,并在需要其值的变量上添加断点。 它显示每个变量消耗了多少字节,以及十六进制值。

【讨论】:

  • 您好 Jayansh,感谢您的建议。不幸的是,我正在使用 Rcpp。代码编辑器是 Rstudio。 cpp 文件将首先被编译,然后被 R 脚本调用。因此,没有可用的断点选项。
【解决方案2】:

我最终在我的程序中发现了这个错误,虽然我没有使用监控变量内存使用的技术。

原来我对变量使用“按引用传递”,然后再次将函数结果分配给变量。像下面这样,

struct myStruct{
mat mat1;
double doub1;
}

myStruct RcppFun1(mat & mat1, double & doub1){
//do something to mat1 and doub1
 
myStruct newStruct1;

newStruct1.mat1=mat1;
newStruct1.doub1=doub1;

return newStruct1;
}

//....

myStruct newStruct2=RcppFun1(mat1,doub1);

mat1=newStruct2.mat1;
doub1=newStruct2.doub1;

Struct 被使用是因为我最初想从函数返回多个结果。后来,我想减少计算时间(mat1 很大),我使用了“按引用传递”。但是,我忘记删除Struct 并创建函数void。以下代码没有“内存不足”的问题。

void RcppFun1(mat & mat1, double & doub1){
//do something to mat1 and doub1

}

//....

newStruct2=RcppFun1(mat1,doub1);

同样有趣的是,这个bug会在不同的机器上导致不同的错误:

在一台 Linux 服务器上,它“内存不足”并导致我的程序被杀死。

在另一个 Linux 服务器上,它是“Segmentation fault (core dumped)”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 2011-04-30
    • 2012-03-29
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多