Rcpp容器在超出功能范围后似乎不释放内存:
# include <Rcpp.h>
using namespace Rcpp;
double f(int siz)
{
IntegerVector a = Rcpp::sample(siz, siz);
return std::accumulate(a.begin(), a.end(), 0.0);
}
// [[Rcpp::export]]
NumericVector test(int siz)
{
NumericVector rst(siz);
for(int i = 0; i < siz; ++i)
{
rst[i] = f(siz);
}
return rst;
}
/***R
rst = test(1000000)
*/
上述程序很快就会填满我的32GB内存。如何释放为Rcpp::IntegerVector
中的f()
分配的内存?
谢谢
注意:请改用IntegerVector a = Language("sample", siz, siz).eval()
。 a
的空格将立即从函数中释放出来。
注意2:通过阅读Rcpp
的源代码,最佳解决方案是对自定义sample()
进行编程。 Rcpp::sample()
的核心组成部分是unif_rand()
。将unif_rand()
整合到Fisher-Yates Shuffle的现代版本中。问题解决了。