That is very good to know.

On Tuesday, 10 May 2016 20:30:41 UTC-7, Alex Miller wrote:
>
> range is reducible and boils down to just a local loop in most cases, so 
> shouldn't create any heap garbage (well, other than whatever your reducing 
> function does). 
>
> See:
>
> https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/LongRange.java#L229-L238
>
> Additionally, it can act as a chunked lazy sequence, and in that usage it 
> stores no values either, each chunk is just a start + a step and values are 
> produced by offset. It does cache the lazy chunked sequence though, so 
> you'll get a linked list of chunks essentially (representing 32 values 
> each). 
>
> More than you want to know can be found here: 
> http://dev.clojure.org/jira/browse/CLJ-1515
>
> Similar tricks are played with the other sequence "generators" like 
> iterate, cycle, and repeat, although those don't chunk (
> http://dev.clojure.org/jira/browse/CLJ-1603). 
>
> But to your original question about whether using sequences bloats memory 
> - yes in the general case. For large sequences, you should consider 
> alternatives - collections (like vectors) or in extreme cases Clojure 
> primitive vectors (see vector-of), Java collections, or arrays (usually the 
> most compact). Like everything else, sequences are a tradeoff, and 
> generally a good one due to caching and immutability, tempered by chunking 
> and transients. I'm glad we have more options now though with transducers. 
>
>
> On Tuesday, May 10, 2016 at 7:21:12 PM UTC-5, tbc++ wrote:
>>
>> In addition, as of 1.7, (range 1000) no longer creates a lazy sequence. 
>> It creates something that acts a bit like a sequence, but is reducable. So 
>> doing something like (reduce + 0 (range 1000)) is super fast and creates 
>> almost no garbage at all. 
>>
>> On Tue, May 10, 2016 at 5:46 PM, Alan Thompson <cloo...@gmail.com 
>> <javascript:>> wrote:
>>
>>> I don't understand what you mean. '(range 1000)' produces a lazy 
>>> sequence, and '(reduce + ...)' doesn't hold onto the head of the lazy 
>>> sequence. Therefore, each element can be GC'd as soon as added into the 
>>> running total, the the lazy sequence only produces new elements as they are 
>>> requested by the reduction (chunking aside, of course).
>>> Alan
>>>
>>> On Tue, May 10, 2016 at 4:14 PM, JvJ <kfjwh...@gmail.com <javascript:>> 
>>> wrote:
>>>
>>>> That brings me to another thing I've wondered about.  It is a typical 
>>>> clojure idiom to do something like (reduce + (range 1000)).
>>>>
>>>> But, unlike imperative loops, this will cache all those 1000 elements.  
>>>> This can kind of bloat memory, especially with large sequences?
>>>>
>>>> How can you get around it (other than tail-recursion or the while 
>>>> construction)?
>>>>
>>>> On Tuesday, 10 May 2016 09:45:50 UTC-7, Alex Miller wrote:
>>>>>
>>>>> Because some of the time you don't want caching. For example, if you 
>>>>> want to (later) reduce over a large (larger than memory even) external 
>>>>> resource. eductions allow you to define the source in one spot but defer 
>>>>> the (eager) reduction until later.
>>>>>
>>>>> On Tuesday, May 10, 2016 at 11:22:24 AM UTC-5, JvJ wrote:
>>>>>>
>>>>>> In that case, why aren't eductions just lazy sequences?
>>>>>>
>>>>>> On Monday, 9 May 2016 16:07:55 UTC-7, Alex Miller wrote:
>>>>>>>
>>>>>>> eductions are non-caching (will re-perform their work each time they 
>>>>>>> are used), so most of the time I would say lazy sequences are 
>>>>>>> preferable.
>>>>>>>
>>>>>>> On Monday, May 9, 2016 at 4:54:48 PM UTC-5, JvJ wrote:
>>>>>>>>
>>>>>>>> In a similar vein, do you think that eductions are generally a 
>>>>>>>> better idea than lazy sequences/for comprehensions?
>>>>>>>>
>>>>>>>>>
>>>>>>>>> -- 
>>>> You received this message because you are subscribed to the Google
>>>> Groups "Clojure" group.
>>>> To post to this group, send email to clo...@googlegroups.com 
>>>> <javascript:>
>>>> Note that posts from new members are moderated - please be patient with 
>>>> your first post.
>>>> To unsubscribe from this group, send email to
>>>> clojure+u...@googlegroups.com <javascript:>
>>>> 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+u...@googlegroups.com <javascript:>.
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>>
>>> -- 
>>> You received this message because you are subscribed to the Google
>>> Groups "Clojure" group.
>>> To post to this group, send email to clo...@googlegroups.com 
>>> <javascript:>
>>> Note that posts from new members are moderated - please be patient with 
>>> your first post.
>>> To unsubscribe from this group, send email to
>>> clojure+u...@googlegroups.com <javascript:>
>>> 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+u...@googlegroups.com <javascript:>.
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>>
>>
>> -- 
>> “One of the main causes of the fall of the Roman Empire was that–lacking 
>> zero–they had no way to indicate successful termination of their C 
>> programs.”
>> (Robert Firth) 
>>
>

-- 
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/d/optout.

Reply via email to