Ver Mensaje Individual
  #5  
Antiguo 26-03-2015
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.913
Reputación: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Tienes varios problemas de eficiencia en tu código (aparte que no se ve muy idiomatico), y no estas sacando ventaja de .NET!

La parte importante es que estan cargando (doble) el archivo de texto, en vez de procesar en modo de stream (o linea a linea pa hacerlo mas simplista). Ademas, no estas manejando transacciones ni reusando los planes de ejecucion, ni manejando correctamente los recursos (recursos= handles a BD, archivos, etc... todo lo que es externo a .NET).

Primero, debes anular la idea de hacer el conteo de lineas pa saber el total. Puedes en vez de eso usar el tamaño del archivo en bytes, e ir aumentando los bytes procesados... pero mostrar en porcentaje para que sea menos confuso para el usuario.

Te pongo un ejemplo de como puede quedar (lo tengo con Postgres porque en mi Mac no tengo Firebird):

Código PHP:
using System;
using System.IO;
using Npgsql//Aqui cambia a FB!

namespace test
{
    public 
delegate bool UpdateGui(uint progreso) ;

    class 
MainClass
    
{

        public 
void LoadData(NpgsqlConnection dbstring fileNameUpdateGui ui)
        {
            
//Recorre linea a linea, NO CARGES TODO EL ARCHIVO EN MEMORIA!
            
uint progreso 0;

            foreach (
string line in File.ReadLines(fileName))
            {
                
progreso += 1;
                if (!
ui(progreso)) {
                    break;
                }

                
//Haz la logica de datos aqui...
            
}
                        
        }

        
//Aisla la GUI
        
public bool UpdateGui(uint progreso) {
            
//Ahora esto es mas testeable y puedes aislar el tema de Threading y no
            //bloquear pantalla
            
Console.Write ("Actualizado {0}"progreso);
            return 
true//Informar si se cancela o no
        
}

        public static 
void Main (string[] args)
        {            
            
NpgsqlConnection db = new NpgsqlConnection("CON STRING");

            
//Encapsula acceso a recursos externos (db, filess) con USING!
            //Eso auto-cierra la conexion (como en un TRY/FINALLY
            
using (db) {
                
//Igual encapusla transacciones
                //Procesos en batch = 1 transaccion
                
using (NpgsqlTransaction tran db.BeginTransaction ()) {
                    
//Separa la GUI de la logica
                    
LoadData (db, @"Path archivo"UpdateGui);

                    
tran.Commit ();
                }
            }
        }
    }

Esto es mas idiomatico, y eso que aun se puede hacer mucho mejor con lo que da la nueva funcionalidad de C#/.NET...

Se puede alterar para que haga los commit en batch (ej, cada 100 registros), para lo que debes concatenar los INSERT con un StringBuilder en vez de hacer registro a registro, pero esta es masomenos la idea general...


P.D: Te recomiendo que estudies bien como se hace C# moderno, que te estas perdiendo toda la diversion

En especial busca como hacer:

1- Async/Await
2- yield
3- Un ORM: El mejor es Dapper
4- Que es nuevo en .NET para tu version VS la ultima que recuerdas (ej: Si empezaste con .NET 1, mira que ha ido cambiando hasta la actual) y de ser posible pasate a la ultima version
5- LINQ!

Eso para empezar ;
__________________
El malabarista.

Última edición por mamcx fecha: 26-03-2015 a las 18:25:06.
Responder Con Cita