You're right Simon. 'open' is so common name.. and it's probably used in
some other part of R. I reneme it's from "open" to "open1" and now it works
without segfaults.

Thanks,
daniel

W dniu 10 września 2010 20:52 użytkownik Simon Urbanek <
simon.urbanek@r-project.org> napisał:

> Daniel,
>
> I doubt that your issue has anything to do with memcpy. Make sure you're
> really using the code that you think you're using (I suspect you are not)
> and run R -d gdb to find out more about your crash. As for the actual code -
> you should probably use the type check from open2() in open() as well.
>
> Cheers,
> Simon
>
>
> On Sep 10, 2010, at 1:27 PM, Daniel Cegiełka wrote:
>
> > 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@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
> >
> > ______________________________________________
> > R-devel@r-project.org mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-devel
> >
> >
>
>

	[[alternative HTML version deleted]]

