none
Reducir tiempo al crear archivo RRS feed

  • Pregunta

  • buenas tardes,

    una duda a ver si alguien me puede ayudar:

    tengo una aplicación que lee una tabla de registros en mysql y genera un archivo XML con la estructura que me piden.

    Al archivo se exportan casi 6000 registros y tarda casi 30 minutos.

    La aplicación no realiza ni operaciones ni nada, solo lee el registro almacenado en mysql y creo una etiqueta xml por cada columna.

    Existe alguna forma de poder reducir ese tiempo??

    Gracias.

    martes, 25 de julio de 2017 12:06

Respuestas

  • [...] voy concadenando en un string cada uno de esos campos [...]

    Ese podría ser el problema. Los strings son muy ineficientes cuando les vas concatenando valores, debido a que la clase String es inmutable en .Net y por lo tanto cada vez que se hace una nueva concatenación hay que construir un nuevo string y liberar el anterior para el Garbage Collector. Esto supone una enorme presión sobre el gestor de memoria y la operación se vuelve lenta.

    La solución es usar la clase StringBuilder para hacer las concatenaciones, y al final de todo, cuando se haya terminado de concatenar, se llama al método .ToString del StringBuilder para convertir a String el resultado final.

    miércoles, 26 de julio de 2017 12:42

Todas las respuestas

  • Revisa a ver cuál es el sitio exacto del programa en el que pierde el tiempo. Mi sospecha es que debe ser cuando "ensamblas" el Xml. Puede que estés usando un XmlDocument o un XDocument, y haciendo búsquedas dentro del documento al añadir cada nodo (para buscar el punto de inserción), con lo que los tiempos crecen con el cuadrado del número de nodos. La recomendación sería usar un XmlTextWriter, que escribirá todo el archivo de golpe a toda velocidad (tan rápido como vayan llegando los registros desde la base de datos).

    https://msdn.microsoft.com/en-us/library/system.xml.xmltextwriter(v=vs.110).aspx

    Otra alternativa, en caso de que no necesites un control muy fino sobre la estructura de XML, es cargar todos los registros en un DataTable (puedes hacerlo con un DataAdapter, y debería tardar una fracción de segundo para solo 6000 registros), y luego usar WriteXml para que lo vuelque todo a un fichero XML.

    • Propuesto como respuesta Willams Morales miércoles, 26 de julio de 2017 15:25
    martes, 25 de julio de 2017 12:32
  • Gracias por responder,

    te explico con más detalle lo que hago:

    realizo una consulta mysql y guardo los registros en un datatable. Después voy recorriendo cada registro de ese datatable y voy concadenando en un string cada uno de esos campos para formar el xml. El nombre de las etiquetas que le pongo en el xml no es igual que en nombre de bases de datos.

    Una vez tengo todo el xml en un string lo guardo en un fichero de esta manera

    fs = File.Create(path)
    info = New UTF8Encoding(True).GetBytes(CADENA_CON_XML)
    fs.Write(info, 0, info.Length)

    miércoles, 26 de julio de 2017 6:57
  • [...] voy concadenando en un string cada uno de esos campos [...]

    Ese podría ser el problema. Los strings son muy ineficientes cuando les vas concatenando valores, debido a que la clase String es inmutable en .Net y por lo tanto cada vez que se hace una nueva concatenación hay que construir un nuevo string y liberar el anterior para el Garbage Collector. Esto supone una enorme presión sobre el gestor de memoria y la operación se vuelve lenta.

    La solución es usar la clase StringBuilder para hacer las concatenaciones, y al final de todo, cuando se haya terminado de concatenar, se llama al método .ToString del StringBuilder para convertir a String el resultado final.

    miércoles, 26 de julio de 2017 12:42
  • MUCHAS GRACIAS!!!

    lo he probado y sí ha reducio el tiempo en casi 10 min, supongo que iría mas rápido si quitará subconsultas mysql y validaciones que he tenido que colocar por cada registro.

    jueves, 27 de julio de 2017 8:08