Tengo un problema que me ha estado molestando por unos días. Intenté buscar el problema en Google, pero hasta ahora no he podido encontrar ninguna solución, ni siquiera una sola persona con el mismo problema.C# System.Buffer.BlockCopy ¿Problema de memoria?
Parece que el método C# System.Buffer.BlockCopy te deja con algún tipo de fantasmas de memoria. Tengo, por ejemplo, este método:
private float[,] readFloatArray2 (byte[] b) {
int floatSize = sizeof(float);
float[,] v = new float[2, (b.Length/2)/floatSize];
System.Buffer.BlockCopy(b, 0, v, 0, b.Length);
return v;
}
para convertir una matriz de bytes en una matriz de flotación 2D. Los datos se leen previamente de una secuencia. He localizado el problema para que sea el método System.Buffer.BlockCopy.
Si elimino el comando BlockCopy, la memoria utilizada por la aplicación tendrá la mitad del tamaño. esto significa que no es mi culpa que la matriz de bytes todavía esté viva. porque sin el comando BlockCopy, la matriz de bytes muere correctamente. la matriz flotante se crea de todos modos (con o sin la información copiada).
No estoy seguro si esto es un problema del comando BlockCopy o del GC porque también he intentado llamar a System.GC.Collect(); después de BlockCopy y luego también funciona perfectamente (sé que no deberías hacer esto ... por eso estoy pidiendo consejo aquí).
Tampoco me molestaría en preguntar, pero el problema involucra varios cientos de megas.
Además de los problemas de memoria, el método funciona perfectamente bien. ¿Alguien sabe qué causa el problema de memoria?
saludos y gracias de antemano oli
PS: Estoy utilizando .NET4.0 con Visual Studio 2010 PRO y Win7 ... no saben si esto es relevante o no.
Si dice que la memoria se recoge correctamente con un 'GC.Collect', todo está bien. 'b' * * será eventualmente recolectado por un GC normal cuando llegue el momento. –
Si está trabajando en datos de audio, usaría una matriz dentada de la forma 'float [len] [channelCount]'. De esta forma, puede tratar los canales por separado, lo que a veces es útil. – CodesInChaos
"la matriz flotante se crea de todos modos" Solo la mitad de verdad. No necesariamente necesita memoria física todavía. Las páginas de memoria que son todas 0 y nunca se han escrito en ellas, están optimizadas por el administrador de memoria de Windows. – CodesInChaos