【问题标题】:How calling stats::optim from Rcpp causes memory leak?从 Rcpp 调用 stats::optim 如何导致内存泄漏?
【发布时间】:2020-10-20 19:16:55
【问题描述】:

在我的部分代码中,我需要优化 Rcpp 中的一个函数(我在这里遵循了第二个答案 Applying the optim function in R in C++ with Rcpp)。但是,我发现该函数会泄漏内存(很少,但如果它是重复运行模拟的一部分,它会复杂化)。我创建了一个最小的可重现示例,但我不知道泄漏的来源/如何处理它。我可以寻求有关处理此问题的指导吗?

Rcpp 代码:

#include <Rcpp.h>
using namespace Rcpp;
double objective_function(double x){
  double obj = .666 - x;
  return pow(obj, 2);
}
// [[Rcpp::export(leak)]]
double leak(double a, double b){
 

  // Extract R's optim function
  Rcpp::Environment stats("package:stats");
  Rcpp::Function optim = stats["optim"];
 
  // Call the optim function from R in C++
  Rcpp::List opt_results = optim(Rcpp::_["par"]    = .5,
                                 Rcpp::_["fn"]     = Rcpp::InternalFunction(&objective_function),
                                 Rcpp::_["method"] = "Brent",
                                 Rcpp::_["lower"]  = a,
                                 Rcpp::_["upper"]  = b);
 
  // Extract out the estimated parameter values
  double mu = opt_results[0];
 
  // Return estimated values
  return mu;
}

R 代码:

repeat{
  leak(0, 1)
}

当我查看我的任务管理器时,Rstudio R Session 下的 RAM 使用量正在稳步增加(如果我使用任何其他只返回值的函数,则不会发生这种情况)。

【问题讨论】:

  • 如果你像往常一样直接在 R 中调用optim,是否也会发生泄漏?
  • 这是一个很好的问题@HongOoi。我只是尝试直接从 R 优化 Rcpp 定义的函数,并且不会发生泄漏。如果我从 Rcpp 泄漏函数中对其进行优化,就会发生这种情况。

标签: rcpp


【解决方案1】:

使用 macOS + Instruments 检漏仪,Rcpp::InternalFunction 似乎正在泄漏:

这将我们指向这里的代码:

https://github.com/RcppCore/Rcpp/blob/97222bb753c4cd76a4cef7d33c2bfc2e305d1158/inst/include/Rcpp/generated/InternalFunction__ctors.h#L35-L38

请注意,我们使用new 分配一个对象,但我们也告诉XPtr 不要注册一个删除终结器:

https://github.com/RcppCore/Rcpp/blob/97222bb753c4cd76a4cef7d33c2bfc2e305d1158/inst/include/Rcpp/XPtr.h#L88-L106

我并不清楚为什么我们这样做,但我认为它解释了这种行为。这可能值得filing an issue。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-01-13
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 2015-10-18
  • 2015-07-06
  • 2014-06-07
  • 2013-11-20
相关资源
最近更新 更多