[Rcpp-devel] R session crashes when largely using a Rcpp sourced function

Pierre.Gloaguen at ifremer.fr Pierre.Gloaguen at ifremer.fr
Tue Oct 7 00:31:06 CEST 2014


Dirk Eddelbuettel <edd at debian.org> a écrit :

>
> On 6 October 2014 at 23:36, Pierre.Gloaguen at ifremer.fr wrote:
> | 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?
>
> Yes, the Rcpp::Function() class allows you to call R functions from C++.
>
Ok, i will try this, thank you for the help!
> Part of me thinks, though, that once you are in C++ you may be able to just
> control your memory, not call back, compute your result and then report it
> back to R.  But such an idealised situation may not work in your case -- and
> sorry that I did not have time to work through your code in any detail.

No worries! I'm glad I found out by myself after all this times
Have a nice day,

Pierre
>
> Dirk
>
>
> | 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
> | >
> |
> |
> |
> | _______________________________________________
> | Rcpp-devel mailing list
> | Rcpp-devel at lists.r-forge.r-project.org
> | https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
>
> --
> http://dirk.eddelbuettel.com | @eddelbuettel | edd at debian.org
>





More information about the Rcpp-devel mailing list