[Rcpp-devel] R session crashes when largely using a Rcpp sourced function
Pierre.Gloaguen at ifremer.fr
Pierre.Gloaguen at ifremer.fr
Mon Oct 6 23:36:38 CEST 2014
Hello,
I have found out that the problem was in the R loop, the garbage
collection of R wasn't perform efficiently. Indeed, when I force the
garbage collection to be done, using R function gc(), the Rsession
won't crash, although the execution of the loop will be slower.
This leads me to another question. Is there anyway to force the
garbage collection inside a Rcpp function?
like this
NumericVector myfunction(NumericVector x){
for(int= i = 0; i < x.size; ++i){
//do my stuff;
gc();
}
}
Thanks for any help!
Pierre Gloaguen
pgloague at ifremer.fr a écrit :
> Hello everyone,
>
> I am a new user of Rcpp, I use it to rewrite a whole R program.
> at the end of the program, my "final function is the following"
>
> #include <RcppArmadillo.h>
> #include <Rcpp.h>
> #define _USE_MATH_DEFINES
> #include <math.h>
> using namespace Rcpp;
>
> // [[Rcpp::depends("RcppArmadillo")]]
>
> List main_function_C(arma::vec X0,arma::vec XF,double t0,
> double tF, arma::mat Gamma,
> NumericVector piks,arma::mat muks, List Cks,
> int max_iter = 500){
> List bounds = bounds_fun_C(piks,Cks,Gamma);
> double sup_bound = 0.5 *(as<double>(bounds["alpha_bar"])
> + as<double>(bounds["delta_max"])
> - as<double>(bounds["delta_min"]));
> bool accept = false;
> int kappa = 0;
> arma::mat omegas(2,2);//arbitrary size, will change in loop
> NumericVector Psi(5);//arbitrary size, will change in loop
> for(int i = 0; i < max_iter; ++i){
> kappa = rpois(1,(tF-t0)*sup_bound)[0];
> if(kappa > 0){
> Psi = stl_sort(runif(kappa,t0,tF));
> NumericVector Upsilon = runif(kappa, 0, sup_bound);
> omegas = rubb_it_C(X0, XF, t0, tF, Psi);
> NumericVector phi_omega(kappa);
> for(int i = 1; i < kappa+2; i++){
> phi_omega[i-1] = phi_C(arma::trans(omegas.row(i)),
> piks,muks,Cks,Gamma);
> }
> accept = all_C((phi_omega < Upsilon));
> }//end if kappa >0
> else{
> accept = true;
> }
> if(accept){
> break;
> }
> }//end for
> arma::mat res(kappa+2,3);//result matrix,
> if(kappa > 0){
> res.submat(0,0,kappa+1,1) = omegas;
> res(0,2) = t0;
> for(int i =1; i < kappa+1;++i){
> res(i,2) = Psi[i-1];
> //Psi is of size kappa the index then goes till kappa-1
> }
> res(kappa+1,2) = tF;
> }
> else{
> res(0,arma::span(0,1)) = trans(X0);
> res(1,arma::span(0,1)) = trans(XF);
> res(0,2) = t0;
> res(kappa+1,2) = tF;
> }
> return List::create(Named("skel") = res,
> Named("accepted") = accept);
> }
>
> This function calls other funtion that I have written, all of them
> are attached on the cpp_funcs.cpp file.
> The sourceCpp performs well and I can, from R obtain the following result
>
> sourceCpp("cpp_funcs.cpp")
> X0 <- c(0.5,0.5)
> XF <- c(1,1)
> t0 <- 0
> tF <- 1
> Gam <- diag(0.1,2)
> ncomp=2
> pis <- c(0.5,0.5)
> mu <- matrix(c(-1,1,
> 1,1),ncol=2,nrow=ncomp)
> cov <- list(diag(0.5,2),diag(1,2))
> set.seed(123)
> test <- main_function_C(X0,XF,t0,tF,Gam,pis,mu,cov)
> test
> #$skel
> [,1] [,2] [,3]
> #[1,] 0.5000000 0.500000 0.0000000
> #[2,] -0.1261731 1.313880 0.4089769
> #[3,] 0.5564577 1.069211 0.7883051
> #[4,] 1.0000000 1.000000 1.0000000
>
> #$accepted
> #[1] TRUE
>
> PROBLEM:
>
> When I run the exact same code as above a large number of times, as this
>
> for(i in 1:1000){
> ## same code as above
> }
>
> The r session aborts all the time, giving no error message but "R
> encountered a fatal error".
> I do not encounter this problem with the intermediate functions in
> the attached file (and, of course, I'm not asking for a debugging
> of those), I only have it with this one
>
> Is this a problem with my code? with how the loop is written?The List object?
> Is this a problem of the memory?
>
> It does it either on Rstudio or Rgui
> I work on windows 7, with R version 3.0.2
> Rcpp 0.11.2 and RcppArmadillo 0.4.450.1.0
>
> I also attach a R debugging file giving parameters for all
> intermediate functions.
>
> Sorry for the length of the function, I'm pretty sure the problem
> comes from the main function, but it sadly depends on others (which,
> as far as I know, don't pose problems)
>
> Thanks in advance for any help,
>
> Pierre Gloaguen
>
More information about the Rcpp-devel
mailing list