Tengo una aplicación C# 4.0 (productor único/consumidor único) que transfiere gran cantidad de datos en fragmentos. Aunque no hay una nueva asignación de memoria, me quedo sin memoria después de un tiempo.Fragmentación del montón al usar matrices de bytes
I memoria perfilada utilizando el perfilador de memoria Redgate y hay una gran cantidad de memoria libre allí. Dice que la memoria libre no se puede usar debido a la fragmentación.
utilizo el bloqueo de una colección como las matrices de amortiguamiento y de bytes como los miembros:
BlockingCollection<byte[]> segments = new BlockingCollection<byte[]>(8);
// producer:
segments.Add(buffer);
// consumer:
byte[] buffer = _segments.Take();
¿Cómo puedo evitar la fragmentación de la memoria administrada?
Chris tiene razón, la otra opción es usar objetos de menos de 85k para que no terminen asignados en el LOH. – Ian
La solución de Microsoft es lo suficientemente buena para mi caso. Como es abstracto, debería implementar el mío. Entonces debería crear un administrador de buffer 'estático' para todas las instancias de transportadores de datos o un singleton o un miembro de instancia por transportador de datos (cada transportador de datos vive durante 2 a 3 horas y hay 1000 de ellos, cada uno usa 8x256 KB de memoria) – Xaqron
La creación de un administrador de búfer para cada transportador suena como si simplemente moviera el problema de fragmentación del montón a un lugar diferente (asignando trozos más grandes de memoria y luego liberándola de nuevo). Podrías tener un grupo de administradores de búfer, pero yo iría primero con el singleton y veré si hay algún problema con él. Probablemente pueda diseñarlo para que esté escondido detrás de una interfaz y cada transportador tenga su propia referencia. Luego puede cambiar fácilmente la implementación entre singleton y por instancia o algo intermedio como lo desee. – ChrisWue