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

On 12-05-06 7:53 AM, Duncan Murdoch wrote:
> 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.

Yes, I think that's it.  I get a similar error from this code:

one <- paste0("one", 1:1e7) # okay
two <- paste0("two", 1:1e7) # gives error

So I think the error handling should be improved somewhere in the string 
allocation code ("out of memory" would be a better message!), but it 
probably has nothing to do with unlist.

Duncan Murdoch

>
> 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