
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@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe