Creé una aplicación WPF de prueba para probar SixLabors.ImageSharp para ver cómo funcionaba y si cumplía con algunos requisitos, etc. antes de cualquier integración en una aplicación de producción.
Mi aplicación de prueba consta de un control Imagen para mostrar la imagen que se manipulará y algunos botones para cargar una imagen, rotar y aplicar rotación.
Cuando se inicia la aplicación, consume aproximadamente entre 30 y 40 MB de memoria del sistema.
Sin embargo, tan pronto como aplico una rotación a la imagen usando el siguiente código y la guardo en el disco, el uso de la memoria pasa de ~25-40 MB a ~300-500 MB.
Si aplico una segunda rotación a la imagen, el uso de la memoria vuelve a subir hasta unos ~600-800 MB.
Si aplico una tercera rotación a la imagen, el uso de la memoria vuelve a subir hasta unos ~850-1000 MB.
Si aplico una cuarta rotación a la imagen, el uso de la memoria cae alrededor de donde se realizó la primera rotación, en algún lugar ~ 300-500 MB.
Estoy especificando que la aplicación usa MinimalPooling para intentar mantener bajo el uso de la memoria.
Configuration.Default.MemoryAllocator = ArrayPoolMemoryAllocator.CreateWithMinimalPooling();código de rotación
private void ApplyRotation() { string output; using (SixLabors.ImageSharp.Image image = SixLabors.ImageSharp.Image.Load(imageToProcess)) { // Decide based on the angle which rotation to use/ // Rotate the image in place. // 'x' signifies the current image processing context. switch (angle) { case 0: case 360: break; case 90: image.Mutate(x => x.Rotate(RotateMode.Rotate90)); break; case 180: image.Mutate(x => x.Rotate(RotateMode.Rotate180)); break; case 270: image.Mutate(x => x.Rotate(RotateMode.Rotate270)); break; } // The library automatically picks an encoder based on the file extension then // encodes and write the data to disk. // You can optionally set the encoder to choose. output = imageToProcess; image.Save(output); } }En cuanto a la documentación de ImageSharp , afirma que ImageSharp retiene aproximadamente 300-400 MB de memoria debido a su uso de ArrayPools. Esto explica el primer salto de memoria cuando la biblioteca se usa por primera vez, sin embargo, los saltos posteriores en el uso de la memoria no los entiendo ni sé cómo liberarlos.
he utilizado
Configuration.Default.MemoryAllocator.ReleaseRetainedResources();como se encuentra en su documentación, que creo que debería liberar los recursos que se están reteniendo. Este no parece ser el caso. Si aplico 3 rotaciones a mi imagen y el uso de la memoria es de alrededor de 1 GB, en ningún momento de la ejecución de la aplicación se reducirá a menos de 300 MB, incluso si los controles se usan en otra ventana y luego se cierran.
¿Alguien sabe cómo reducir este uso de memoria o deshacerse de todo para que el uso de memoria vuelva a la normalidad?
Gracias