Ok I get it. So everytime it does a alloc and copy. I haven't finished the design yet. I'm just thinking about how randomly the data might arrive; its real time data. So I will allocate a large chunk of memory and keep track of when it fills up, once the data exceeds I will alloc and copy the data (provided the size is within system limits). In this manner I should be able to reduce the number of expensive operations of allocing and copying.
Thanks for your input. Regards Abhijit Bera On Sat, Oct 24, 2009 at 10:06 PM, Douglas Bates <ba...@stat.wisc.edu> wrote: > On Fri, Oct 23, 2009 at 2:02 PM, Abhijit Bera <abhib...@gmail.com> wrote: > > Sorry, I made a mistake while writing the code. The declaration of Data > > should have been first. > > > I still have some doubts: > > Because you are making some sweeping and incorrect assumptions about > the way that the internals of R operate. R allows for arrays to be > dynamically resized but this is accomplished internally by allocating > new storage, copying the current contents to this new location and > installing the values of the new elements. It is an expensive > operation, which is why it is discouraged. > > Your design is deeply flawed. Go back to the drawing board. > > > When you say calloc and realloc are you talking about R's C interface > Calloc > > and Realloc or the regular calloc and realloc? > > Either one. > > > I want to feed data directly into a R matrix and grow it as required. So > at > > one time I might have 100 rows coming in from a data source. The next > time I > > might have 200 rows coming in from a data source. I want to be able to > > expand the R-matrix instead of creating a regular C float matrix and then > > make an R-matrix based on the new size. I just want to have one R object > and > > be able to expand it's size dynamically. > > R stores floating-point numbers as the C data type double, not float. > It may seem pedantic to point out distinctions like that but not when > you are writing programs. Compilers are the ultimate pedants - they > are real sticklers for getting the details right. > > As I said, it just doesn't work the way that you think it does. The > fact that there is an R object with a certain name before and after an > operation doesn't mean it is the same R object. > > > I was reading the language specs. It says that one could declare an > object > > in R like this: > > > > m=matrix(nrows=10,ncols=10) > > > > and then one could assign > > > > m[101]=1.00 > > > > to expand the object. > > > > but this has one problem when I do a > > > > dim(m) > > > > I get > > > > NULL instead of 10 10 > > > > So what is happening here? > > > > > > I am aware that R matrices are stored in column major order. > > > > Thanks for the tip on using float *dat= REAL(Data); > > > > Regards > > > > Abhijit Bera > > > > > > > > On Fri, Oct 23, 2009 at 7:27 PM, Douglas Bates <ba...@stat.wisc.edu> > wrote: > >> > >> On Fri, Oct 23, 2009 at 9:23 AM, Douglas Bates <ba...@stat.wisc.edu> > >> wrote: > >> > On Fri, Oct 23, 2009 at 8:39 AM, Abhijit Bera <abhib...@gmail.com> > >> > wrote: > >> >> Hi > >> >> > >> >> I'm having slight confusion. > >> > > >> > Indeed. > >> > > >> >> I plan to grow/realloc a matrix depending on the data available in a > C > >> >> program. > >> > > >> >> Here is what I'm tried to do: > >> > > >> >> Data=allocMatrix(REALSXP,3,4); > >> >> SEXP Data; > >> > > >> > Those lines should be in the other order, shouldn't they? > >> > > >> > Also, you need to PROTECT Data or bad things will happen. > >> > > >> >> REAL(Data)[8]=0.001123; > >> >> REAL(Data)[200000]=0.001125; > >> >> printf("%f %f\n\n\n\n",REAL(Data)[8],REAL(Data)[200000]); > >> > >> And I forgot to mention, it is not a good idea to write REAL(Data) > >> many times like this. REAL is a function, not a macro and you are > >> calling the same function over and over again unnecessarily. It is > >> better to write > >> > >> double *dat = REAL(Data); > >> > >> and use the dat pointer instead of REAL(Data). > >> > >> >> Here is my confusion: > >> > > >> >> Do I always require to allocate the exact number of data elements in > a > >> >> R > >> >> Matrix? > >> > > >> > Yes. > >> > > >> >> In the above code segment I have clearly exceeded the number of > >> >> elements that have been allocated but my program doesn't crash. > >> > > >> > Remember that when programming in C you have a lot of rope with which > >> > to hang yourself. You have corrupted a memory location beyond that > >> > allocated to the array but nothing bad has happened - yet. > >> > > >> >> I don't find any specific R functions for reallocation incase my data > >> >> set > >> >> grows. How do I reallocate? > >> > > >> > You allocate a new matrix, copy the contents of the current matrix to > >> > the new matrix, then release the old one. It gets tricky in that you > >> > should unprotect the old one and protect the new one but you need to > >> > watch the order of those operations. > >> > > >> > This approach is not a very good one. If you really need to grow an > >> > array it is better to allocate and reallocate the memory within your C > >> > code using calloc and realloc then, at the end of the calculations, > >> > allocate an R matrix and copy the results over. > >> > > >> > Also, you haven't said whether you are growing the matrix by row or by > >> > column or both. If you are adding rows then you can't just reallocate > >> > storage because R stores matrices in column-major order. The positions > >> > of the elements in a matrix with n+1 rows are different from those in > >> > a matrix with n rows. > >> > > >> >> Is it necessary to reallocate or is R handling > >> >> the memory management for the matrix that I have allocated? > >> >> > >> >> Regards > >> >> > >> >> Abhijit Bera > >> >> > >> >> [[alternative HTML version deleted]] > >> >> > >> >> ______________________________________________ > >> >> R-devel@r-project.org mailing list > >> >> https://stat.ethz.ch/mailman/listinfo/r-devel > >> >> > >> > > > > > > [[alternative HTML version deleted]] ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel