[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