[Rd] [xts, quantmod] segfault probelm when I work with memcpy function

Daniel Cegiełka daniel.cegielka at gmail.com
Fri Sep 10 19:27:00 CEST 2010


Hi,

I work with SEXP C code and with xts and quantmod packages. I try to
touch how xts internal works.

So we have R session and:

> ls()
character(0)
> getSymbols('AAPL')     # quantmod package
[1] "AAPL"
> ls()
[1] "AAPL"
> str(AAPL)
An ‘xts’ object from 2007-01-03 to 2010-09-09 containing:
  Data: num [1:929, 1:6] 86.3 84 85.8 86 86.5 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:6] "AAPL.Open" "AAPL.High" "AAPL.Low" "AAPL.Close" ...
  Indexed by objects of class: [Date] TZ:
  xts Attributes:
List of 2
 $ src    : chr "yahoo"
 $ updated: POSIXct[1:1], format: "2010-09-10 18:42:10"
> tail(AAPL,5)
           AAPL.Open AAPL.High AAPL.Low AAPL.Close AAPL.Volume AAPL.Adjusted
2010-09-02    251.26    252.17   248.57     252.17    14811900        252.17
2010-09-03    255.09    258.78   254.50     258.77    18580100        258.77
2010-09-07    256.64    259.53   256.25     257.81    12234200        257.81
2010-09-08    259.78    264.39   259.10     262.92    18777000        262.92
2010-09-09    265.04    266.52   262.92     263.07    15642700        263.07
>
> q()
Save workspace image? [y/n/c]: y
[danice at entropy ~]$


It's looks, that xts data in mamory looks like this (Open=o,High=h,Low=l etc):

ooooo(...)ohhhhh(...)hlllll(...)lccccc(...)cvvvvv(...)vaaaaa(...)a

So if I want to read Open price I need to read this array (from C
code) from x[0] to x[nrow(x)-1] where x is the pointer do AAPL.


I have to test functions - one based on memcpy and second based on for loop:


#include <R.h>
#include <Rinternals.h>

SEXP open(SEXP x) {
        int nr=nrows(x);
        SEXP r;
        PROTECT(r=allocVector(REALSXP,nr));

        memcpy(&REAL(r)[0],&REAL(x)[0],nr*sizeof(double));

        UNPROTECT(1);
        return(r);
}


SEXP open2(SEXP x) {
        int P=0;
        if (TYPEOF(x) != REALSXP) { PROTECT(x = coerceVector(x,REALSXP)); P++; }
        double *d_x = REAL(x);
        int nr = nrows(x);

        SEXP s;
        PROTECT(s = allocVector(REALSXP,nr));
        P++;
        double *d_s = REAL(s);

        int i;
        for (i=0;i<nr;i++) d_s[i] = d_x[i];

        UNPROTECT(P);
        return(s);
}

We starts R session again and:


> # we have AAPL data in memory
>
> ls()
[1] "AAPL"
> tail(AAPL)
           AAPL.Open AAPL.High AAPL.Low AAPL.Close AAPL.Volume AAPL.Adjusted
2010-09-02    251.26    252.17   248.57     252.17    14811900        252.17
2010-09-03    255.09    258.78   254.50     258.77    18580100        258.77
2010-09-07    256.64    259.53   256.25     257.81    12234200        257.81
2010-09-08    259.78    264.39   259.10     262.92    18777000        262.92
2010-09-09    265.04    266.52   262.92     263.07    15642700        263.07
>
> # now we call do open2 function
>
> .Call('open2',AAPL)
  [1]  86.29  84.05  85.77  85.96  86.45  94.75  95.94  94.59  95.68
97.56  92.10  88.63  89.14  85.73  86.68  87.11  87.11  86.30  86.43
84.86  86.23  84.12

(...)

>
> # and now call to open based on memcpy
>
> .Call('open',AAPL)
  [1]  86.29  84.05  85.77  85.96  86.45  94.75  95.94  94.59  95.68
97.56  92.10  88.63  89.14  85.73  86.68  87.11  87.11  86.30  86.43
84.86  86.23  84.12

(...)



AND HERE IS MY PROBLEM:

We download new data:

> getSymbols('IBM')
[1] "IBM"
>
> ####    WE DOWNLOAD NEW DATA
>
> getSymbols('IBM')
[1] "IBM"
>
> # and try open2 function (based on for loop)
>
> .Call('open2',AAPL)
  [1]  86.29  84.05  85.77  85.96  86.45  94.75  95.94  94.59  95.68
97.56  92.10  88.63  89.14

(...)

>
> # now we try open function based on memcpy
> # ... and we will have a segfault
>
> .Call('open',AAPL)

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

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


I have this problem only if I download new data...

Do someone know how can I solve this memcpy problem? memcpy should be
much faster in this kind of area... and I want to write some C based
extensions for xts package.

Best regards,
daniel



More information about the R-devel mailing list