We have an application that holds large numbers of objects in several Dictionary
s, some of which grow continually during the lifetime of the app (trading application with lots of instruments and continually growing orders/trades).
We are having problems with OutOfMemoryException
s due to fragmentation of the large object heap.
To counter this I've tried to write a 'large' dictionary that is implemented as a two level dictionary where all the leaf dictionaries are not large enough to be allocated on the LOH. I've used a consistent hashing algorithm to avoid having to rehash the entire dictionary when a single bucket becomes too large. The consistent hashing 'circle' is a TreeDictionary
from the C5 collections library.
My question is, are there any better data structures (or perhaps better implementations of the one I described) for C#?
Update
This is the implementation for the 'large' dictionary: https://gist.github.com/956621
I understand it's not foolproof as neither the LOH heap threshold is in the specification, nor the size of each Dictionary entry or scaling algorithm. However, this is currently the best I can think of to avoid the application blowing up mid-day.
OutOfMemoryException
s start getting thrown. – Westley