On Fri, 2011-02-18 at 17:27 +0300, Michael A Baikov wrote:
> I am trying to play with iteratee making parser for squid log files, but 
> found that my code do not run in constant space when it tries to process 
> compressed log files. So i simplified my code down to this snippet:
> 
> import Data.ByteString (ByteString)
> import Data.Iteratee as I
> import Data.Iteratee.Char
> import Data.Iteratee.ZLib
> import System
> 
> main = do
>         args <- getArgs
>         let fname     = args !! 0
>         let blockSize = read $ args !! 1
> 
>         fileDriver (leak blockSize) fname >>= print
> 
> leak :: Int -> Iteratee ByteString IO ()
> leak blockSize = joinIM $ enumInflate GZip defaultDecompressParams chunkedRead
>     where
>         consChunk :: Iteratee ByteString IO String
>         consChunk = (joinI $ I.take blockSize I.length) >>= return . show
> 
>         chunkedRead :: Iteratee ByteString IO ()
>         chunkedRead = joinI $ convStream consChunk printLines
> 
> 
> First argument - file name (/var/log/messages.1.gz will do)
> second - size of block to consume input. with low size (10 bytes) of consumed 
> blocks it leaks very fast, with larger blocks (~10000) it works almost 
> without leaks.
> 
> So. Is it bugs within my code, or iteratee-compress should behave differently?

After looking into problem (or rather onto your code) - the problem have
nothing to do with iteratee-compress I believe. I get similar behaviour
and results when I replace "joinIM $ enumInflate GZip
defaultDecompressParams chunkedRead" by chunkedRead. (The memory is
smaller but it is due to decompression not iteratee fault).

Regards

Attachment: signature.asc
Description: This is a digitally signed message part

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to