<p>You might want to look at conduits if you need deterministic and prompt finalisation. I would sketch out a solution but I have only my phone.</p>
<div class="gmail_quote">On Sep 4, 2012 2:36 PM, &quot;Ian Knopke&quot; &lt;<a href="mailto:ian.knopke@gmail.com">ian.knopke@gmail.com</a>&gt; wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi Lorenzo,<br>
<br>
You&#39;re correct. Well spotted! I must have created that doing some copy<br>
and paste. The program is basically as you suggested it. Here&#39;s a<br>
corrected version:<br>
<br>
main = do<br>
<br>
    -- get a list of file names<br>
    filelist &lt;- getFileList &quot;testsetdir&quot;<br>
<br>
    -- process each compressed file<br>
    files &lt;- mapM (\x -&gt; do<br>
                            thisfile &lt;- B.readFile x<br>
                            return (Z.decompress thisfile)<br>
                    ) filelist<br>
<br>
    display $ processEntries files<br>
<br>
    putStrLn &quot;finished&quot;<br>
<br>
-- processEntries<br>
-- processEntries is defined elsewhere, but basically does some string<br>
-- processing per line, counts the number of resulting elements and<br>
sums them per file<br>
processEntries :: [B.ByteString] -&gt; Int<br>
processEntries xs = foldl&#39; (\x y -&gt; x + countItems (B.lines y)) 0 xs<br>
<br>
I&#39;m still running into memory issues though. I think it&#39;s the mapM<br>
loop above and that each file is not being released after reading<br>
through it. Does that seem reasonable, and is there any way to write<br>
this better?<br>
<br>
<br>
Ian<br>
<br>
<br>
<br>
... and countItems uses foldl&#39;<br>
On Tue, Sep 4, 2012 at 1:55 PM, Lorenzo Bolla &lt;<a href="mailto:lbolla@gmail.com">lbolla@gmail.com</a>&gt; wrote:<br>
&gt; On Tue, Sep 4, 2012 at 11:00 AM, Ian Knopke &lt;<a href="mailto:ian.knopke@gmail.com">ian.knopke@gmail.com</a>&gt; wrote:<br>
&gt;&gt; main = do<br>
&gt;&gt;<br>
&gt;&gt;     -- get a list of file names<br>
&gt;&gt;     filelist &lt;- getFileList &quot;testsetdir&quot;<br>
&gt;&gt;<br>
&gt;&gt;     -- process each compressed file<br>
&gt;&gt;     files &lt;- mapM (\x -&gt; do<br>
&gt;&gt;                             thisfile &lt;- B.readFile x<br>
&gt;&gt;                             return (Z.decompress thisfile)<br>
&gt;&gt;                     ) filelist<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;     display $ processEntries files<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;     putStrLn &quot;finished&quot;<br>
&gt;&gt;<br>
&gt;&gt; -- processEntries<br>
&gt;&gt; -- processEntries is defined elsewhere, but basically does some string<br>
&gt;&gt; processing per line,<br>
&gt;&gt; -- counts the number of resulting elements and sums them per file<br>
&gt;&gt; processEntries :: [B.ByteString] -&gt; Int<br>
&gt;&gt; processEntries xs = foldl&#39; (\x y -&gt; x + processEntries (B.lines y)) 0 xs<br>
&gt;<br>
&gt; The problem seems to be your `processEntries` function: it is<br>
&gt; recursively defined, and as far as I understand, it&#39;s never going to<br>
&gt; end because &quot;y&quot; (inside the lambda function) is always going to be the<br>
&gt; full list of files (xs).<br>
&gt;<br>
&gt; Probably, `processEntries` should be something like:<br>
&gt;<br>
&gt; processEntries = foldl&#39; (\acc fileContent -&gt; acc + processFileContent<br>
&gt; fileContent) 0<br>
&gt;<br>
&gt; processFileContent :: B.ByteString -&gt; Int<br>
&gt; processFileContent = -- count what you have to, in a file<br>
&gt;<br>
&gt; In fact, processEntries could be rewritten without using foldl&#39;:<br>
&gt; processEntries = sum . map processFileContent<br>
&gt;<br>
&gt; hth,<br>
&gt; L.<br>
<br>
_______________________________________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/beginners" target="_blank">http://www.haskell.org/mailman/listinfo/beginners</a><br>
</blockquote></div>