[Haskell-cafe] why does the binary library require so much memory?

Don Stewart dons at galois.com
Fri Jul 31 17:20:14 EDT 2009


I just need a small test case to reproduce the problem.

Thanks!

-- Don

jeremy:
> Hello,
> 
> Using encode/decode from Binary seems to permamently increase my
> memory consumption by 60x fold. I am wonder if I am doing something
> wrong, or if this is an issue with Binary.
> 
> If I run the following program, it uses sensible amounts of memory
> (1MB) (note that the bin and list' thunks won't actully be evaluated):
> 
> import Data.Binary
> 
> main :: IO ()
> main =
>     let list = [1..1000000] :: [Int]
>         bin   = encode list
>         list' = decode bin :: [Int]
>     in putStrLn (show . length $ takeWhile (< 10000000) list) >> getLine >> return ()
> 
> /tmp $ ghc --make -O2 Bin.hs -o bin
> /tmp $ ./bin +RTS -s
> /tmp/bin +RTS -s 
> 1000000
> 
>       68,308,156 bytes allocated in the heap
>            6,700 bytes copied during GC
>           18,032 bytes maximum residency (1 sample(s))
>           22,476 bytes maximum slop
>                1 MB total memory in use (0 MB lost due to fragmentation)
> 
>   Generation 0:   130 collections,     0 parallel,  0.00s,  0.00s elapsed
>   Generation 1:     1 collections,     0 parallel,  0.00s,  0.00s elapsed
> 
>   INIT  time    0.00s  (  0.00s elapsed)
>   MUT   time    0.05s  (  0.92s elapsed)
>   GC    time    0.00s  (  0.00s elapsed)
>   EXIT  time    0.00s  (  0.00s elapsed)
>   Total time    0.05s  (  0.92s elapsed)
> 
>   %GC time       0.0%  (0.1% elapsed)
> 
>   Alloc rate    1,313,542,603 bytes per MUT second
> 
>   Productivity 100.0% of total user, 5.7% of total elapsed
> 
> According to top:
> 
>    VIRT RSS   SHR
>    3880 1548  804
> 
> 
> Now, if I change *list* in the last line to *list'* so that the
> encode/decode stuff actually happens:
> 
> /tmp $ ./bin +RTS -s
> /tmp/bin +RTS -s 
> 1000000
> 
>      617,573,932 bytes allocated in the heap
>      262,281,412 bytes copied during GC
>       20,035,672 bytes maximum residency (10 sample(s))
>        2,187,296 bytes maximum slop
>               63 MB total memory in use (0 MB lost due to fragmentation)
> 
>   Generation 0:  1151 collections,     0 parallel,  0.47s,  0.48s elapsed
>   Generation 1:    10 collections,     0 parallel,  0.36s,  0.40s elapsed
> 
>   INIT  time    0.00s  (  0.00s elapsed)
>   MUT   time    0.47s  ( 20.32s elapsed)
>   GC    time    0.84s  (  0.88s elapsed)
>   EXIT  time    0.00s  (  0.00s elapsed)
>   Total time    1.30s  ( 21.19s elapsed)
> 
>   %GC time      64.1%  (4.1% elapsed)
> 
>   Alloc rate    1,319,520,653 bytes per MUT second
> 
>   Productivity  35.9% of total user, 2.2% of total elapsed
> 
> And top reports:
> 
>    VIRT   RSS  SHR
>    67368  64m  896
> 
> 63 times as much total memory in use. And, this is while the program
> is waiting around at 'getLine' after it is 'done' with the data.
> 
> I am using GHC 6.10.4 on GNU/Linux.
> 
> Thanks!
> - jeremy
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe


More information about the Haskell-Cafe mailing list