Tenemos una aplicación que contiene un gran número de objetos en varios Dictionary
s, algunos de los cuales crecen continuamente durante la vida útil de la aplicación (aplicación comercial con muchos instrumentos y órdenes/intercambios en continuo crecimiento).Large Object Heap friendly IDictionary
Estamos teniendo problemas con OutOfMemoryException
debido a la fragmentación del montón de objetos grandes.
Para contrarrestar esto, he tratado de escribir un diccionario 'grande' que se implementa como un diccionario de dos niveles donde todos los diccionarios de hoja no son lo suficientemente grandes para ser asignados en el LOH. He usado un algoritmo de hash consistente para evitar tener que repetir todo el diccionario cuando un solo segmento se vuelve demasiado grande. El 'círculo' hash consistente es TreeDictionary
de la biblioteca de colecciones C5.
Mi pregunta es, ¿hay mejores estructuras de datos (o quizás mejores implementaciones de la que describí) para C#?
actualización
Ésta es la aplicación para el diccionario 'grande': https://gist.github.com/956621
entiendo que no es infalible, ya que ni el umbral LOH montón es en la especificación, ni el tamaño de cada entrada de diccionario o algoritmo de escala. Sin embargo, esto es actualmente lo mejor que puedo pensar para evitar que la aplicación explote a mediodía.
Podría ayudar saber qué problemas ve con su implementación actual? –
Si está utilizando su diccionario como almacén de valores-clave para objetos planos, puede considerar un archivo mapeado en memoria. – hsmiths
¿Ha verificado que no está "goteando" memoria en ningún lugar (como en las referencias retenidas 'pérdidas' de memoria) –