Pregunta

Actualización: Probablemente confundí problemas de uso de memoria con la interfaz de usuario que comparte el mismo hilo que el procesamiento (como señala MusiGenesis a continuación). Sin embargo con respecto al uso de la memoria. Todavía no puedo encontrar la sintaxis específica de VB.net, aunque la gente ha señalado una excelente información de .Net y C # a continuación (y si estuviera más versado en esas tecnologías, uno podría adaptarse para trabajar con VB.net).

Estoy creando una aplicación VB.Net.

  • La aplicación básicamente analiza datos Archivos ubicados en la máquina del cliente en DataSet / DataTables.
  • Luego usando DataView, desglosa el Tablas de datos en fragmentos manejables, escribe en XML y envía los datos XML a un servicio web.

Los conceptos generales funcionan bien, sin embargo, tengo problemas en los que Mem Usage on Task Manager sigue creciendo a medida que el programa se usa para cargar más y más archivos.

En el inicio, antes de hacer nada, la aplicación VB tiene 27,000 K. Una vez que se analiza el archivo e incluso después de que elimine el identificador de archivo, los datos aumentan mucho. Elimino todo en el código y todavía parece que la memoria en Mem Usage permanece capturada. No hay una rima o razón de por qué el uso de Mem está creciendo (es decir, a veces puede crecer en 20 mb al leer un archivo de 7 MB, sin embargo, otras veces no aumenta en absoluto, al leer un archivo de 3 MB). A veces, parece liberar algo de memoria cuando se completa el análisis y otras veces simplemente se mantiene.

He mirado el .Net Memory Profiler y realmente no he podido hacer cara o cruz a partir de eso.
He leído mucho en Internet sobre la gestión de memoria en .Net en general sobre Dispose y "Nada". y DataSets, etc., sin embargo, realmente no han encontrado nada sobre VB.Net específicamente.

Mi pregunta general es : ¿Existen buenos tutoriales / libros / blogs / etc. que muestren un tutorial más profundo sobre la administración de memoria en una aplicación VB.Net (es decir, cómo / cuándo desechar / cerrar, etc.), o alguien tiene algunos consejos específicos de su experiencia.

¿Fue útil?

Solución

Primero, debe darse cuenta de que el Administrador de tareas le muestra la cantidad de memoria que el sistema operativo ha asignado a su aplicación. Esta no es necesariamente la cantidad de memoria que realmente se está utilizando. Cuando se inicia por primera vez una aplicación .NET, el sistema operativo le asigna memoria, tal como lo hace para cualquier proceso. El tiempo de ejecución de .NET luego divide aún más esa memoria y administra cómo se usa. El tiempo de ejecución puede considerarse como "codicioso" en que una vez asignada la memoria por el sistema operativo, no la devolverá a menos que el sistema operativo lo solicite específicamente. El resultado es que el uso de memoria en el Administrador de tareas no es preciso.

Para obtener una imagen real del uso de su memoria, debe usar el Monitor de rendimiento y agregar los contadores adecuados.

En cuanto a IDisposable y el patrón de disposición, probablemente no encontrará mucho que hable sobre esto en términos específicos del idioma, ya que es algo proporcionado por .NET Framework y es independiente del lenguaje. El patrón es el mismo sin importar el idioma que use, solo la sintaxis es diferente.

Hay varias referencias disponibles que le brindarán información sobre cómo funciona la administración de memoria. Tengo dos publicaciones de blog, una que habla sobre Uso de la recolección de basura en .NET y uno que enumera los diversos recursos Solía ??crear dos presentaciones sobre administración de memoria en .NET.

La mejor " regla general " es que si una clase implementa IDisposable , lo hace por una razón y debe asegurarse de que está llamando a Dispose () cuando termine de usar la instancia. Esto se logra más fácilmente con el usando declaración.

Otros consejos

La gestión de memoria en VB.Net en realidad es manejada por .Net Framework, por lo que, en general, es lo mismo en VB.Net que en C #. Sin embargo, comprender cómo funciona le permite tomar mejores decisiones de programación: cuándo declarar variables, cuándo están dispuestos los objetos. En ese contexto, creo que su pregunta podría enmarcarse como `` ¿hay alguna buena fuente para decirme cómo codificar eficientemente? y para una huella de memoria más pequeña '', O '' ¿Puede alguien decirme por qué están sucediendo estas cosas extrañas? ''. Ambas preguntas pueden responderse dando una comprensión más completa de cómo .Net gestiona la memoria, el alcance, etc. Hay toneladas de recursos para responder a esto,

Dicho esto, este primer enlace tiene muchos otros enlaces que podrían serle útiles:

http: // geekswithblogs.net/sdorman/archive/2008/09/14/.net-memory-management-ndash-resources.aspx

Y este segundo es más importante:

http://www.c-sharpcorner.com/UploadFile /tkagarwal/MemoryManagementInNet11232005064832AM/MemoryManagementInNet.aspx

Si fuera usted, usaría un perfilador para ver exactamente qué está haciendo la aplicación. Hay varios: JetBrains, RedGate, YourKit. Desde allí puede ver exactamente dónde no se libera la memoria.

Entonces puede ver exactamente dónde necesita concentrarse para corregir el problema

Esta no es una respuesta a su pregunta general, pero puede enviar un DataTable directamente a un servicio web sin el paso intermedio de escribirlo primero en XML. En realidad, no puede enviar una DataTable, pero puede enviar un DataSet (porque DataSet es serializable mientras DataTable no lo es), por lo que puede enviar una DataTable directamente envolviéndola primero en un DataSet y luego enviando el DataSet. El protocolo SOAP convierte el DataSet a XML de todos modos, por lo que realmente no está ganando nada al convertir el DataTable a XML usted mismo.

Supongo por su pregunta que sus DataTables son demasiado grandes para enviarlas todas a la vez, o de lo contrario las está dividiendo en fragmentos más pequeños para que su aplicación cliente pueda indicar el progreso al usuario. Esto también se puede hacer sin escribir el contenido en XML usted mismo.

Con respecto a su pregunta general, no es sorprendente que a veces su consumo de memoria crezca 20mb al leer (y enviar) un archivo de 7mb. El XML utilizado para describir un DataTable y su contenido (ya sea que lo esté haciendo usted mismo o se esté serializando automáticamente cuando lo envía directamente a un servicio web) es muy detallado.

Su enfoque más eficiente para este problema sería enviar los archivos de datos del cliente directamente al servicio web (como una matriz de un solo byte [] o como una serie de matrices de byte []), y luego procesar estos archivos completamente en el servidor. Este enfoque minimizará el tiempo requerido para enviar cada archivo al servidor (porque enviar 7mb lleva menos tiempo que enviar 20mb o incluso más).

El mejor libro para leer sobre el tema que he leído es el libro de Jeff Richter, CLR a través de C #:

http://www.amazon.com/CLR-via-Second-Pro -Developer / dp / 0735621632 / ref = sr_1_1? Ie = UTF8 & amp; qid = 1252853101 & amp; sr = 8-1-hechizo

Si desea una versión VB.NET, la tienen para la primera edición del libro, pero no creo que haya suficiente interés para traducir el libro a VB.NET para la segunda versión. Si realmente quiere aprender .NET, debe sentirse cómodo con C #. En ambos idiomas, la memoria es administrada por el CLR.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top