<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    Hello,<br>
    <br>
    I'm trying to understand how memory is allocated and collected when
    working with streams.<br>
    I recently asked a question about how to limit memory when using
    streams on Stackoverflow<br>
    and got two good answers:<br>
    &nbsp;&nbsp;&nbsp;
    <meta http-equiv="content-type" content="text/html;
      charset=ISO-8859-1">
    <a
href="http://stackoverflow.com/questions/18629188/how-to-limit-memory-use-when-using-a-stream">http://stackoverflow.com/questions/18629188/how-to-limit-memory-use-when-using-a-stream</a><br>
    <br>
    However, I'm seeking a better understanding than could really be
    given through the SO format.<br>
    I want to use streams because I have too much data to fit in memory
    and hence want to use them<br>
    to bring in the data from files and databases sequentially as
    needed.&nbsp; However, I'm finding that<br>
    the GC is not collecting as I would have hoped and hence streams are
    not quite as straightforward<br>
    a solution as I expected.&nbsp; The sort of problems that I am
    experiencing are demonstrated with the<br>
    following code<br>
    <br>
    &nbsp; #lang racket<br>
    &nbsp; (require rackunit)<br>
    <br>
    &nbsp; ; This program fails with out of memory errors when memory limit
    set to 128mb<br>
    &nbsp; ; It always fails when it comes to testing filtered-nums,
    regardless of how test-nums?<br>
    &nbsp; ; and test-gen-nums? have been set.&nbsp; However
    test-for/sum-gen-filtered-nums?<br>
    &nbsp; ; also fails if set.<br>
    <br>
    &nbsp; (define max-num 10000000)<br>
    &nbsp; (define test-nums? #f)<br>
    &nbsp; (define test-gen-filtered-nums? #f)<br>
    &nbsp; (define test-for/sum-gen-filtered-nums? #f)<br>
    <br>
    &nbsp; (define nums (in-range max-num))<br>
    &nbsp; (define filtered-nums<br>
    &nbsp; &nbsp; (stream-filter (&#955; (i) (values #t)) nums))<br>
    <br>
    &nbsp; (define (gen-filtered-nums)<br>
    &nbsp; &nbsp; (stream-filter (&#955; (i) (values #t)) nums))<br>
    <br>
    &nbsp; (when test-nums?<br>
    &nbsp; &nbsp; (displayln "Testing nums")<br>
    &nbsp; &nbsp; (check-equal? max-num (stream-length nums)))<br>
    <br>
    &nbsp; (when test-gen-filtered-nums?<br>
    &nbsp; &nbsp; (displayln "Testing gen-filtered-nums")<br>
    &nbsp; &nbsp; (check-equal? max-num (stream-length (gen-filtered-nums))))<br>
    <br>
    &nbsp; (when test-for/sum-gen-filtered-nums?<br>
    &nbsp; &nbsp; (displayln "Testing with for/sum-gen-filtered-nums ")<br>
    &nbsp; &nbsp; (check-equal? max-num (for/sum ([i (gen-filtered-nums)]) 1)))<br>
    <br>
    <br>
    &nbsp; (displayln "Testing filtered-nums")<br>
    &nbsp; (check-equal? max-num (stream-length filtered-nums))<br>
    <br>
    <br>
    I understand that making multiple passes through a big data is
    inefficient,<br>
    but here I am trying to gain a better understanding of the GC. So
    this leads<br>
    me to a few related questions:<br>
    <br>
    &nbsp; i.&nbsp; Why does the GC seem to collect more effectively when the
    stream is<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; created in a function as opposed to in a straight definition?
    i.e<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test-gen-filtered-nums? passes, although I note that<br>
    &nbsp; &nbsp;&nbsp;&nbsp; test-for/sum-gen-filtered-nums? doesn't.<br>
    &nbsp; ii.&nbsp; Is stream-filter inappropriate to use with big data sets?<br>
    &nbsp; iii. Is there a better choice than streams for dealing with big
    data sets, coming from<br>
    &nbsp; &nbsp; &nbsp; disparate sources such as files, databases, etc,&nbsp; within
    racket?<br>
    <br>
    <br>
    Thanks<br>
    <br>
    <br>
    <br>
    Lorry<br>
    <br>
    <br>
    <pre class="moz-signature" cols="72">-- 
vLife Systems Ltd
Registered Office: The Meridian, 4 Copthall House, Station Square, Coventry, CV1 2FL
Registered in England and Wales No. 06477649
<a class="moz-txt-link-freetext" href="http://vlifesystems.com">http://vlifesystems.com</a>
</pre>
  </body>
</html>