Saltar al contenido

Mejores prácticas para optimizar la memoria en C#

Buscamos por todo el mundo on line para así mostrarte la solución a tu problema, si tienes alguna pregunta puedes dejarnos tu pregunta y contestamos sin falta, porque estamos para servirte.

Solución:

Puedes usar Perfilador de memoria ANTS de Redgate (no libre).

O Perfilador CLR (gratis): https://msdn.microsoft.com/library/ms979205

GC.Collect() no se recomienda incluso si es necesario en algunos casos. Por favor, eche un vistazo al siguiente código:

private void WriteStringOnImage()

    try
    
        byte[] imgData = getData(@"E:000.tif");
        using (System.Drawing.Image img = System.Drawing.Image.FromStream(new MemoryStream(imgData)))
        
            for (int i = 1; i <= 1000; i++)
            
                Bitmap img1 = new Bitmap(new Bitmap(img));
                RectangleF rectf = new RectangleF(800, 550, 200, 200);
                Graphics g = Graphics.FromImage(img1);
                g.DrawString(i.ToString("0000"), new Font("Thaoma", 30), Brushes.Black, rectf);
                img1.Save(@"E:Img" + i.ToString("0000") + ".tif");
                g.Flush();
                g.Dispose();
                img1.Dispose();
                GC.Collect();
            
        
    
    catch (Exception)

En el ejemplo anterior usé GC.Collect() porque si no uso GC.Collect() entonces está tomando la memoria alrededor 1500 MB. Pero después del uso de GC.Collect() si nunca es superior a 75 MB

es decir, la utilización de la memoria es disminuido en 20 veces.

Pero si GC.Collect() se está usando en exceso y no hay muchos objetos sin usar en la memoria, entonces GC.Collect() ralentizará su rendimiento y consumirá mucho tiempo.

También puedes usar Dispose() si se implementa IDisposable.

Si está trabajando con MemoryStream o cualquier otro tipo de flujo, entonces debe usar el using bloques

A veces también es necesario vaciar algún objeto haciéndolo null.

Como sabemos, si procesamos datos XML, se necesita mucha memoria, por lo que debemos liberar la memoria después del uso, pero la clase XML no implementa la interfaz Idisposable, por lo que debe hacerlo. null (p.ej xmldocument=null;)

También debe tener en cuenta acerca de inicialización de objetos innecesarios.

por ejemplo, en lugar de:

ClassA abc=new ClassA();
abc=xyz;

Utilizar:

ClassA abc=xyz;

Intente usar la variable de nivel de método en lugar del nivel de clase si se usa en un solo método.

Asegúrese de borrar los objetos de la colección.

Vigile el uso de la memoria por parte de cualquier herramienta de terceros que se esté utilizando en su aplicación. A veces, las herramientas de terceros requieren mucha memoria.

Utilizar static sólo si es imprescindible.

Utilizar StringBuilder en lugar de String. Porque si string se concatena, luego se asigna una nueva memoria para que los datos de la memoria anterior no se utilicen, pero se mantienen en la RAM.

Si algún objeto grande está siendo procesado en clases jerárquicas, vigílelo.

Si algún documento XML se procesa y se ha guardado en la memoria para uso futuro y se usará después de cualquier evento, libere esa memoria y cargue el XML cuando se active el evento requerido.

Evite la clonación.

Si está trabajando con string manipulación puede verificar los datos para un bucle infinito. En algún momento, los caracteres Unicode especiales como puntos suspensivos (...) pueden crear problemas y causas para un bucle infinito.

También puedes usar seguimiento de puntos un perfilador de memoria de Jetbrain.

También puedes investigar registro de eventos para cualquier excepción que esté causando el problema.

Si alguna objeto de mapa de bits se está creando y se está realizando un procesamiento de imágenes, luego eche un vistazo a los recursos no administrados. A el objeto de mapa de bits ocupa una gran cantidad de memoria para los recursos no administrados y eso podría no ser liberado.

Como ha mencionado que también está utilizando el servidor SQL, también vigile Procedimientos y funciones del servidor SQL y sus estrategias de llamadas.

En SQL Server, si está guardando datos como tipo de datos de imagen y si es más grande que 1 mb, utilice varbinary (MAX) con flujo de archivos property pero funcionará con el servidor SQL 2008 o versiones superiores del servidor SQL.

Muchos de estos realmente no optimizan la memoria...

  1. Deseche un objeto después de usarlo o hágalo null. Siempre Dispose() un objeto si es IDisposable. Esto PODRÍA ahorrarle problemas de memoria, pero no necesariamente. (Además, utilice Using si es posible)
  2. Use probar/finalmente o usar bloque.try/finally - Esto es similar a Using para objetos que no son IDisposable (Los encuentro desordenados, así que prefiero esta solución).
  3. Use GC.Collect() si es necesario. Realmente no sería capaz de recomendar GC.Collect(). Normalmente el GC hará un mejor trabajo al saber cuándo recolectar algo que tú.
  4. Eliminar la inicialización de objetos innecesarios. Este definitivamente puede ayudar. Si su código va creando objetos que no son necesarios... entonces esto podría desperdiciar algo de espacio. Esto se puede aliviar/enmascarar con Lazy Initialization.
  5. Administrar el almacenamiento en caché de imágenes. Esto es MUY vago... pero sí... es importante administrar cuántas imágenes tienes almacenadas en la memoria. Puede que no siempre sea deseable mantener las imágenes en la memoria... Puede abrir la puerta a la paginación de otros procesos en su código que son más críticos.
  6. Administre datos BLOB, flujo de memoria y flujo de archivos Creo que esto es similar al #5.

mejores prácticas para optimizar la memoria en C#,

  1. Cree solo los objetos cuando sea necesario
  2. Decida el alcance de cada variable y objeto, si se requieren dentro de los métodos, declarelos dentro de esos métodos, no los haga. private
  3. Utilizar el IDisposable interfaces en sus objetos personalizados y libere todos los recursos (si los hay), anule el registro de todos los eventos, etc.
  4. Llamada dispose cuando un objeto ya no es necesario para sus objetos personalizados
  5. usar menos static variables o instancias, si es necesario, entonces también piense dos veces si esos objetos son necesarios en toda la vida útil del programa
  6. No utilice GC.Collect() manualmente, (es una mala práctica)

Si te animas, puedes dejar un escrito acerca de qué le añadirías a este escrito.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *