I mean, I think that *in both cases* the original sequence *at one point in
time* must be, entirely realized, in memory.

And if there is no doubling of it in critical case, what is critical?

If in (count t) (count d) - non.problematic- case original sequence also, *at
one poin*t, is, actually, in its entirety present in memory, it means that
memory can handle the whole collection.

Maybe my questions sound a bit dubious, but anyway, I'm a bit sold out on
this lisp, so I want to get it right.


On 20 April 2013 23:33, Tonino Jankov <tyaa...@gmail.com> wrote:

> Marko, you say "There is no doubling: *t* and *d* share the same
> underlying lazy sequence and will refer to the same objects. The trouble is
> only that you force the evaluation of *(count d)* while *(count t)* still
> waits to be evaluated, so *t* must definitely stay bound to the head of
> the shared sequence.".
>
> But if there is no doubling, and single lazy sequence is in the memory in
> both cases, how does then memory have problem with one case and not with
> the other?
> If both t and d refer to the same (realized) object in memory.
>
> In both cases, to spit out t or d, the program must have it at one point
> in its memory.
>
> So what spends the EXTRA, critical, OOME memory in (count d) (count t)
> case?
>
> Or does it get instantly garbaged the moment it gets realized in (count t)
> (count d) case?
>
> Anyway, thanks for the exhaustive discussion, Marko & Michal
>
>
>
> On 18 April 2013 00:01, Michał Marczyk <michal.marc...@gmail.com> wrote:
>
>> Note that the problem is not that t needs to hang around; it's that t
>> holds a lazy sequence which hangs around in unrealized state. That
>> lazy sequence internally holds a thunk -- a nullary function --
>> capable of producing the actual sequence elements on request. It is
>> this thunk that holds a reference to the underlying huge sequence.
>> Once t is realized, the actual sequence gets cached and the thunk
>> becomes eligible for GC (the field holding it is set to null). If it
>> then needs to stay around for some other purpose, that is no problem:
>>
>> user=> (let [[t d] (split-with #(< % 12) (range 1e8))] [(count t)
>> (count d) (count t)])
>> [12 99999988 12]
>>
>> (Or I suppose you could return [(count d) (count t)], but (dorun t)
>> before that.)
>>
>> Also, just to be explicit about this, calling (let [x
>> (produce-huge-seq)] (count x)) is not a problem, because x gets
>> cleared prior to control being handed off to count.
>>
>> I've also discussed the details of what's going on on SO, which is
>> where I first noticed this question:
>>
>> http://stackoverflow.com/questions/15994316/clojure-head-retention
>>
>> Cheers,
>> Michał
>>
>>
>> On 17 April 2013 22:53, Marko Topolnik <marko.topol...@gmail.com> wrote:
>> > On Monday, April 15, 2013 1:50:37 AM UTC+2, tyaakow wrote:
>> >>
>> >> Thank you for your response, Marko.
>> >> I want to clarify one more thing:
>> >>
>> >> (let [[t d] (split-with #(< % 12) (range 1e8))]
>> >>     [(count d) (count t)])
>> >>
>> >>
>> >> does this mean that while (count d) is realizing (range 1e8) seq, it
>> >> becomes (also) realized within t, therefore
>> >> it doubles (range 1e8) in memory causing OOME while (count d) is still
>> not
>> >> finished?
>> >
>> >
>> > There is no doubling: t and d share the same underlying lazy sequence
>> and
>> > will refer to the same objects. The trouble is only that you force the
>> > evaluation of (count d) while (count t) still waits to be evaluated, so
>> t
>> > must definitely stay bound to the head of the shared sequence.
>> >
>> >>
>> >> Also, you say "As count realizes one element after another, it doesn't
>> on
>> >> its own retain a reference to the past elements."
>> >>
>> >> Does this mean that, eg. in repl, when I do some (count xyz) and it
>> >> realizes xyz, It will later need to be reevaluated (realized again) if
>> I
>> >> require xyz within repl (I presume that if I require xyz later within
>> file,
>> >> it wont be GC due to it and clojure will know it shouldnt be GC)
>> >
>> >
>> > Be careful to observe that I say "doesn't on its own retain a reference
>> to
>> > the past elements". If you have xyz bound to the head of your sequence,
>> it
>> > will force the entire sequence to stay in memory for as long as xyz is
>> > within scope (if it's a local) or indefinitely (if it's a global def'd
>> var).
>> > Generally, a lazy sequence never gets un-realized once it got
>> realized---the
>> > only option is for it to disappear entirely (turn into garbage).
>> >
>> > -marko
>> >
>> > --
>> > --
>> > You received this message because you are subscribed to the Google
>> > Groups "Clojure" group.
>> > To post to this group, send email to clojure@googlegroups.com
>> > Note that posts from new members are moderated - please be patient with
>> your
>> > first post.
>> > To unsubscribe from this group, send email to
>> > clojure+unsubscr...@googlegroups.com
>> > For more options, visit this group at
>> > http://groups.google.com/group/clojure?hl=en
>> > ---
>> > You received this message because you are subscribed to the Google
>> Groups
>> > "Clojure" group.
>> > To unsubscribe from this group and stop receiving emails from it, send
>> an
>> > email to clojure+unsubscr...@googlegroups.com.
>> > For more options, visit https://groups.google.com/groups/opt_out.
>> >
>> >
>>
>> --
>> --
>> You received this message because you are subscribed to the Google
>> Groups "Clojure" group.
>> To post to this group, send email to clojure@googlegroups.com
>> Note that posts from new members are moderated - please be patient with
>> your first post.
>> To unsubscribe from this group, send email to
>> clojure+unsubscr...@googlegroups.com
>> For more options, visit this group at
>> http://groups.google.com/group/clojure?hl=en
>> ---
>> You received this message because you are subscribed to the Google Groups
>> "Clojure" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to clojure+unsubscr...@googlegroups.com.
>> For more options, visit https://groups.google.com/groups/opt_out.
>>
>>
>>
>

-- 
-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to