Sometimes we  want to store very large collection types in RAM -- such as a Data.Map or Data.IxSet.<div><br></div><div>It seems like we could trade-off some speed for space savings by compressing the values in RAM. </div><div>
<br></div><div>Lemmih has previously created compact-map:</div><div><br></div><div> <a href="http://hackage.haskell.org/package/compact-map">http://hackage.haskell.org/package/compact-map</a></div><div><br></div><div>which mightybyte used to create:</div>
<div><br></div><div><a href="https://github.com/mightybyte/compact-ixset">https://github.com/mightybyte/compact-ixset</a></div><div><br></div><div>compact-map converts the Haskell values to a more compact binary representation. But could we do even better by compressing the bytestrings?</div>
<div><br></div><div>Here is a useless implementation:</div><div><br></div><div><a href="http://hpaste.org/63836">http://hpaste.org/63836</a></div><div><br></div><div>That version compresses each value by itself. But, that is probably going to be worse RAM usage, not better. I think what we really need to do is to store a dictionary in CMap that is used to compress all the ByteString values. That way if the same string appears in 10000 entries, they can all be compressed using the same compression code.</div>
<div><br></div><div>One question is, how much would this benefit us?</div><div><br></div><div>As an experiment I tried compressing one checkpoint file for real world acid-state app that I am involved with. A checkpoint file contains binary data that is serialized by the SafeCopy library. And it is data that is currently store in an IxSet in RAM.</div>
<div><br></div><div>The uncompressed checkpoint file is 115MB. The compressed checkpoint file is 26MB.</div><div><br></div><div>A checkpoint file probably contains more redundancy than an equivalent compressed IxSet because in addition to the values it also includes version tags and other easily compressed data. But, those numbers do look promising. At the very least, they do not rule out the possibility of some big savings.</div>
<div><br></div><div>I do not have time to explore this anymore. But I think it could be a fun project for someone to work on. ;)</div><div><br></div><div>I imagine a prototype with a shared dictionary could be hacked up in a few days. A bit more work would be required to document it, memory profile it, etc.</div>
<div><br></div><div>If done well, we should be able to reuse the incremental compression code in Data.Map, Data.Set, Data.IxSet, HiggsSet, and other places. But, just focusing on Data.Map is a good start. I will create a bug in this bug tracker that links back to this message,</div>
<div><br></div><div><a href="http://code.google.com/p/happstack/issues/list">http://code.google.com/p/happstack/issues/list</a></div><div><br></div><div>- jeremy</div><div><br></div><div><br></div>