[Rcpp-devel] Memory not mapped

Hideyoshi Maeda hideyoshi.maeda at gmail.com
Thu Feb 20 19:16:49 CET 2014


Thanks for the suggestion to keep adding one line at a time, but annoyingly the error has not become apparent…when i add everything but the last section of code it works…but when adding in simple statements at the end, it no longer works

here is the full test.cpp that WORKS


#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
List entryexitclock( SEXP xts_obj_,int ent_col, int exit_col, double clock_limit, int init_pos) {
  // function takes in xts_obj_ (an xts object from R) and converts to a NumericMatrix
  Rcpp::NumericMatrix x(xts_obj_);
  // Get the index and call v
  DatetimeVector v(NumericVector(RObject(xts_obj_).attr("index")));
  // The dimensions of rtn_xts are extracted
  int nr = x.nrow();
  
  int pos = init_pos;
  Rcpp::NumericVector pos_vec(nr);
  Rcpp::NumericVector clock_vec(nr);
  Rcpp::NumericVector real_entry(nr);
  Rcpp::NumericVector signal_exit(nr);
  Rcpp::NumericVector time_exit(nr);
  
  for(int i=0; i<nr; i++){
    if(pos==0){
      // No position before period i
      if(x(i,ent_col)==0){
        // No position and no entry
      } else {
        //No position and entry signal
        pos = 1;
        pos_vec[i] = 1;
        real_entry[i] = 1;
      }
    } else{
      // Exisiting position i.e. pos==1
      // Add the gap difference to the timer
      // time is in seconds...
      double gap_diff = (v[i]-v[i-1]);
      double time_in_trade = clock_vec[i-1]+gap_diff;
      clock_vec[i] = time_in_trade;
      pos_vec[i] = 1;
      if(time_in_trade>=clock_limit){
        //When holding an existing position, exit due to time given 
        pos = 0;
        time_exit[i] = 1;
      } else {
        //If time based exit hasnt triggered...check for signal
        if(x(i,exit_col)==1){
          // Exit signal given with existing position
        } else{
          // No exit signal, so keep position
        }
      }
    }
  }
  
  List l;
  return (l);

}

but when changing the last section (starting from the penultimate else) to something like this…

      } else {
        //If time based exit hasnt triggered...check for signal
        if(x(i,exit_col)==1){
          // Exit signal given with existing position
          pos = 0;
          signal_exit[i] = 1;
        } else{
          // No exit signal, so keep position
        }
      }
    }
  }
 return List::create(_["pos_vec"] = pos_vec, 
                     _["clock_vec"] = clock_vec,
                     _["real_entry"] = real_entry,
                     _["signal_exit"] = signal_exit,
                     _["time_exit"] = time_exit);
}

It no longer works…and I can’t tell why. To me at least it doesn’t look like I’m doing anything crazy...

And to test the code I am running the following….

require(xts)
require(Rcpp)
# 500 days
n <- 60*24*500

# minutely standard dev
sd_m <- 0.003

#minutely mean
mu_m <- 5e-6

# Rate at which entry/exits triggered
entry_rate <- 0.002
exit_rate <- 0.002

# set seed
set.seed(1)

x <- xts(100*cumprod(1+rnorm(n,mu_m,sd_m)),
         as.POSIXct(Sys.Date())+(60*c(1:n)))
x <- round(to.minutes5(x,name="ABC"),2)
x$rand_entry <- rpois(nrow(x),entry_rate)
x$rand_exit <- rpois(nrow(x),exit_rate)

Rcpp::sourceCpp('test.cpp')

init_pos <- 0

clock_time_mins <- 120

res <- lapply(1:100, function(z) {
  entryexitclock(x,match("rand_entry",colnames(x)),
                 match("rand_exit",colnames(x)),
                 clock_time_mins*60,init_pos)
})

The error obtained when adding in the last part of code is:

 *** caught segfault ***
address 0x10d0cfc40, cause 'memory not mapped'

Traceback:
 1: .Primitive(".Call")(<pointer: 0x10155d2e0>, xts_obj_, ent_col,     exit_col, clock_limit, init_pos)
 2: entryexitclock(x, match("rand_entry", colnames(x)), match("rand_exit",     colnames(x)), clock_time_mins * 60, init_pos)
 3: FUN(1:100[[3L]], ...)
 4: lapply(1:100, function(z) {    entryexitclock(x, match("rand_entry", colnames(x)), match("rand_exit",         colnames(x)), clock_time_mins * 60, init_pos)})

Possible actions:
1: abort (with core dump, if enabled)
2: normal R exit
3: exit R without saving workspace
4: exit R saving workspace

Interestingly, from the traceback it suggests it fails on the third attempt (z=3) rather than the first or second...

Any suggestions to help fix this issue would be greatly be appreciated…

hlm





On 20 Feb 2014, at 16:48, Sameer D'Costa <sameerdcosta at gmail.com> wrote:

> One thing you can do is start with a little test case and run multiple times it to see if the segfault is really coming from where you think it is. 
> 
> /*  test.cpp */
> #include <Rcpp.h>
> using namespace Rcpp;
> 
> // [[Rcpp::export]]
> List entryexitclock( SEXP xts_obj_,int ent_col, int exit_col, double clock_limit, int init_pos) {
>   // function takes in xts_obj_ (an xts object from R) and converts to a NumericMatrix
>   Rcpp::NumericMatrix x(xts_obj_);
>   // Get the index and call v
>   DatetimeVector v(NumericVector(RObject(xts_obj_).attr("index")));
>   // The dimensions of rtn_xts are extracted
>   int nr = x.nrow();
>   List l;
>   return (l);
> }
> 
> Then on the R side you can test it out
> library(Rcpp)
> library(xts)
> sourceCpp("test.cpp")
> n <- 10000
> k <- xts(as.numeric(1:n), Sys.time()+1:n)
> res <- lapply(1:10000, function(z) entryexitclock(k, 12, 12, 60*60,0))
> 
> This code does not seem to segfault for me using R 2.15.3 on Ubuntu with Rcpp 0.10.4. Does it segfault for you?
> 
> If I were you I would keep adding code to the test example till it segfaults reliably. If you do this one line at a time you will have a good idea of which line is causing the segfault. Usually the "user error" becomes apparent :).  If you are unsure you could winnow down the test case to a small reproducible  test case that crashes reliably and then post it to the list.
> 
> Regards
> Sameer
> 
> 
> On Thu, Feb 20, 2014 at 9:50 AM, Hideyoshi Maeda <hideyoshi.maeda at gmail.com> wrote:
> Hi I am trying to run a function I created in Rcpp, which is then sourced/compiled and executed in R.
> 
> The function is called “entryexitclock”.
> 
> and starts off as follows:
> 
> #include <Rcpp.h>
> using namespace Rcpp;
> 
> // [[Rcpp::export]]
> List entryexitclock( SEXP xts_obj_,int ent_col, int exit_col, double clock_limit, int init_pos) {
>   // function takes in xts_obj_ (an xts object from R) and converts to a NumericMatrix
>   Rcpp::NumericMatrix x(xts_obj_);
>   // Get the index and call v
>   DatetimeVector v(NumericVector(RObject(xts_obj_).attr("index")));
>   // The dimensions of rtn_xts are extracted
>   int nr = x.nrow();
> 
> There is more code but I’m starting to doubt if its related to the rest of the code. I have a feeling it might be my use of SEXP but I’m not sure...
> 
> The compilation works fine, however “sometimes” the code works and sometimes the code doesn’t…
> 
> The error when it doesn't is as follows:
> 
> 
>  *** caught segfault ***
> address 0x11a9783c8, cause 'memory not mapped'
> 
> Traceback:
>  1: .Primitive(".Call")(<pointer: 0x1044dde70>, xts_obj_, ent_col,     exit_col, clock_limit, init_pos)
>  2: entryexitclock(k, 11, 12, 60 * 60, 0)
> 
> Possible actions:
> 1: abort (with core dump, if enabled)
> 2: normal R exit
> 3: exit R without saving workspace
> 4: exit R saving workspace
> 
> Any suggestions as to what I can do to make sure that this function works every time rather than just sometimes?
> 
> HLM
> 
> 
> 
> _______________________________________________
> 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
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20140220/9564a30c/attachment-0001.html>


More information about the Rcpp-devel mailing list