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.