From murdoch.duncan at gmail.com  Sun May  6 13:53:07 2012
From: murdoch.duncan at gmail.com (Duncan Murdoch)
Date: Sun, 06 May 2012 07:53:07 -0400
Subject: [Rd] unlist crashes 32-bit R on WinXP when use.names=TRUE
In-Reply-To: <4FA655EE.5090201@gmail.com>
References: <CAPPM_gTSU1+YnCpcHL3JFPv4y7R7eFFOfrTXrEAnCPdJfzdgZQ@mail.gmail.com>
	<4FA655EE.5090201@gmail.com>
Message-ID: <4FA66623.8070707@gmail.com>

On 12-05-06 6:43 AM, Duncan Murdoch wrote:
> On 12-05-05 10:39 PM, Joshua Ulrich wrote:
>> Hi all,
>>
>> I experienced a crash in R-2.15.0 on 32-bit Windows XP (sessionInfo
>> below) when running the piece of code below.  I cannot replicate the
>> error on 64-bit Linux, 64-bit Windows, or 32-bit R running under
>> 64-bit Windows.  I do not have, and could not find, a 32-bit version
>> of Linux to test this.
>>
>>> NOW<- Sys.time()
>>> FUTURE<- NOW+1:1e7
>>> crash<- as.character(FUTURE)
>> Error in unlist(unclass(x)[1L:3L]) :
>>     promise already under evaluation: recursive default argument
>> reference or earlier problems?
>>> traceback()
>> Error: C stack usage is too close to the limit
>>> # evaluating an expression at this point would cause R to exit ungracefully
>>
>> Here's an example that avoids a lot of unnecessary code:
>>
>> L1<- list(one=1:1e6, two=1:1e6, three=1:1e6)
>> # no issue with smaller list elements
>> U1<- unlist(L1, recursive=TRUE, use.names=TRUE)
>> C1<- c(L1, recursive=TRUE, use.names=TRUE)
>>
>> L2<- list(one=1:1e7, two=1:1e7, three=1:1e7)
>> # crashes after ~2min with error above
>> U2<- unlist(L2, recursive=TRUE, use.names=TRUE)
>> C2<- c(L2, recursive=TRUE, use.names=TRUE)
>> # no issue if use.names=FALSE
>> U3<- unlist(L2, recursive=TRUE, use.names=FALSE)
>> C3<- c(L2, recursive=TRUE, use.names=FALSE)
>>
>> I took a look at do_unlist and do_c_dflt in bind.c, but I stopped at
>> NewExtractNames because it is a bit beyond my current understanding.
>> Any thoughts?
>
> I would guess that some loop in the C code is using alloca to allocate
> temporary storage on the stack, and it's running out of stack space.
> I'll take a look...

I couldn't spot this anywhere.  I'm not sure what's happening, except 
maybe you're just running out of memory:  you're trying to allocate 3e7 
different names.

Duncan Murdoch

>
> Duncan Murdoch
>
>>
>>> sessionInfo()
>> R version 2.15.0 (2012-03-30)
>> Platform: i386-pc-mingw32/i386 (32-bit)
>>
>> locale:
>> [1] LC_COLLATE=English_United States.1252
>> [2] LC_CTYPE=English_United States.1252
>> [3] LC_MONETARY=English_United States.1252
>> [4] LC_NUMERIC=C
>> [5] LC_TIME=English_United States.1252
>>
>> attached base packages:
>> [1] stats     graphics  grDevices utils     datasets  methods   base
>>
>> Please let me know if I forgot anything or if there's anything I can do to help.
>>
>> Best,
>> --
>> Joshua Ulrich  |  FOSS Trading: www.fosstrading.com
>>
>> R/Finance 2012: Applied Finance with R
>> www.RinFinance.com
>>
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>



[Rd] unlist crashes 32-bit R on WinXP when use.names=TRUE
Duncan Murdoch