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 <clooj...@gmail.com> 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 <kfjwhee...@gmail.com> 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 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.
>>>
>>
>> -- 
>> 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.
>>
>
>
>
> -- 
> “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