Контейнеры 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)
*/
Вышеуказанная программа скоро заполняет мою 32 ГБ памяти. Как освободить память, выделенную для Rcpp::IntegerVector
в f()
?
Спасибо
Примечание: используйте IntegerVector a = Language("sample", siz, siz).eval()
вместо. Пространство для a
будет немедленно выведено из функции.
Примечание2: при чтении исходного кода Rcpp
лучшее решение - запрограммировать настроенный sample()
. Центральным компонентом Rcpp::sample()
является unif_rand()
. Интегрируйте unif_rand()
в современную версию Fisher – Yates Shuffle. Проблема решена.