From toth.denes at ttk.mta.hu  Tue Jun  3 22:56:11 2014
From: toth.denes at ttk.mta.hu (=?UTF-8?B?RMOpbmVzIFTDs3Ro?=)
Date: Tue, 03 Jun 2014 22:56:11 +0200
Subject: [Rd] memory allocation if multiple names point to the same
	object
In-Reply-To: <CAOQ5NyfjOHG29yLE54PVFk_htgPMWw9vZ4RC8=JVPyVzmRinYA@mail.gmail.com>
References: <53779F9A.1040809@oracle.com>	<414982A9-728F-4018-9D96-C3005B57BC05@gmail.com>	<5377F03E.2020702@oracle.com>	<538CA6F8.5060006@ttk.mta.hu>
	<CAOQ5NyfjOHG29yLE54PVFk_htgPMWw9vZ4RC8=JVPyVzmRinYA@mail.gmail.com>
Message-ID: <538E366B.1080707@ttk.mta.hu>

Dear Michael,

thank you for the enlightenment.  Just for the records, here is the 
solution that Michael referred to: 
http://developer.r-project.org/Refcnt.html

Best,
   Denes


On 06/03/2014 03:57 PM, Michael Lawrence wrote:
> This is because R keeps track of the names of an object, until there are
> 2 names. Thus, once it reaches 2, it can no longer decrement the named
> count. In this example, 'a' reaches 2 names ('a' and 'b'), thus R does
> not know that 'a' only has one name at the end.
>
> Luke has added reference counting to R 3.1 to get around these types of
> problems. If you want to try it out, make the necessary change in
> Rinternals.h and recompile. With reference counting, R knows that 'a'
> only has one reference and avoids the copy.
>
>  > a <- seq.int <http://seq.int>(10)
>  > a[1:4] <- 4:1
>  > b <- a
>  > .Internal(inspect(a))
> @2b71608 13 INTSXP g0c4 [REF(2)] (len=10, tl=0) 4,3,2,1,5,...
>  > b[1:4] <- 1:4
>  > .Internal(inspect(b))
> @2b715a0 13 INTSXP g0c4 [REF(1)] (len=10, tl=0) 1,2,3,4,5,...
>  > .Internal(inspect(a))
> @2b71608 13 INTSXP g0c4 [REF(1)] (len=10, tl=0) 4,3,2,1,5,...
>  > a[1:4] <- 1:4
>  > .Internal(inspect(a))
> @2b71608 13 INTSXP g0c4 [REF(1)] (len=10, tl=0) 1,2,3,4,5,...
>
>
>
> On Mon, Jun 2, 2014 at 9:31 AM, D?nes T?th <toth.denes at ttk.mta.hu
> <mailto:toth.denes at ttk.mta.hu>> wrote:
>
>
>     Hi,
>
>     Please consider the following code:
>
>     a <- seq.int <http://seq.int>(10)  # create a
>     tracemem(a)
>     a[1:4] <- 4:1   # no internal copy
>     b <- a          # no internal copy
>     b[1:4] <- 1:4   # copy, b is not a any more
>     a[1:4] <- 1:4   # copy, but why?
>
>     With results:
>      > a <- seq.int <http://seq.int>(10)
>      > tracemem(a)
>     [1] "<0x1792bc0>"
>      > a[1:4] <- 4:1
>      > b <- a
>      > b[1:4] <- 1:4
>     tracemem[0x1792bc0 -> 0x1792b58]:
>      > a[1:4] <- 1:4
>     tracemem[0x1792bc0 -> 0x1792af0]:
>
>
>     ##
>
>     Could you provide a brief explanation or point me to a source why R
>     needs a copy in the final step?
>
>
>     Best,
>        Denes
>
>
>
>      > sessionInfo()
>     R version 3.1.0 (2014-04-10)
>     Platform: x86_64-pc-linux-gnu (64-bit)
>
>     locale:
>       [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C
>       [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8
>       [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8
>       [7] LC_PAPER=en_US.UTF-8       LC_NAME=C
>       [9] LC_ADDRESS=C               LC_TELEPHONE=C
>     [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
>
>     attached base packages:
>     [1] stats     graphics  grDevices utils     datasets  methods   base
>
>     ________________________________________________
>     R-devel at r-project.org <mailto:R-devel at r-project.org> mailing list
>     https://stat.ethz.ch/mailman/__listinfo/r-devel
>     <https://stat.ethz.ch/mailman/listinfo/r-devel>
>
>



[Rd] memory allocation if multiple names point to the same object
=?UTF-8?B?RMOpbmVzIFTDs3Ro?=