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

Jeremy Shaw jeremy at n-heptane.com
Fri Jul 31 19:15:02 EDT 2009


At Fri, 31 Jul 2009 15:43:49 -0700,
Don Stewart wrote:

> Oh, it is entirely possible to use a different instance, that has
> different semantics for lists.  You want  to write  the list
> incrementally?

I don't think so. In happstack, the idea is to have all your state in
RAM. But, since your machine sometimes goes down, etc, we also want to
back it up to disk so we can restore the state after a reboot. There
has also been talk recently about writing the state to /dev/null after
we restore to make sure it has really been successful decoded. We
don't want to lazily find out that there is undecodable data.

So, the desired experience would be:

 1. A program starts running and populates an IxSet. At this point in
    time n MB of RAM are being used.

 2. We use Binary to snapshot the entire IxSet to disk. Since encode
 outputs an lazy ByteString, I would expect only a modest amount of
 additional memory to be required during this process. After the
 snapshot has been completed, I would expect the app to only be using
 around n MB of RAM.

 3. the application exits and restarts

 4. the application reads in the saved IxSet from disk. Afterwords it
    uses only around n MB of RAM.

Instead, it seems like reading the state in from disk results in, n *
60, the amount of RAM being used. I am not really clear on why. It
seems like the serialized version of the list is going to be *smaller*
than original list, since the original list has all sorts of pointers
and thunks. So, even if decode used a strict ByteString I would expect
less than 2x the memory usage...

Where am I going wrong here?

Thanks!
- jeremy


More information about the Haskell-Cafe mailing list