• Domingo 12 de Mayo de 2024, 15:02

Autor Tema:  Acelerar Procesamiento Cdatabase  (Leído 1092 veces)

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
Acelerar Procesamiento Cdatabase
« en: Domingo 24 de Diciembre de 2006, 22:33 »
0
Buenas:

Es una pregunata mas o menos generica espero.
He creado una aplicacion que lee un archivo de texto y lo pasa por un parser que interpreta la informacion desechando ciertas lineas.
Cuando tiene una linea valida lo inserta en una base de datos access ODBC.

He descubierto que en ciertos ordenadores la aplicacion tarda 3 minutos en digerir un archivo. Y en otro ordenador con identico hardware, la misma aplicacion, tarda 1 HORA!.

La pregunta es: existe alguna dll por adjuntar o algun paso intermedio que he ignorado que hace que se prepare el software para ir mas rapido o algo asi?

La aplicacion la prepare para que se linkara con todos los contenidos staticos.

os muestro lo que hago , aunque realmente es muy basico. Pero quizas he dado por alto alguna cosa. En mi ordenador y algunos otros va excelente, pero en otros va lentisimo.


Código: Text
  1.  
  2.  
  3. #define WINVER 0x0501
  4. CDatabase Db;
  5. CString sFile = "access.mdb";
  6.  
  7. int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
  8. {
  9.    CString sDsn;
  10.    CString Sql;
  11.    CString sDriver = "MICROSOFT ACCESS DRIVER (*.MDB)";
  12.    sDsn.Format("ODBC;DRIVER=Microsoft Access Driver (*.mdb);DSN='';DBQ=%s",sFile);
  13.  
  14.    [...]  
  15. //________________________ APERTURA DE DATABASE
  16. try
  17. {
  18.    Db.Open(NULL,false,false,sDsn);
  19. }
  20. catch(CDBException* dbError)
  21. {[...]}
  22. catch(...)
  23. {[...]}
  24. try
  25. {
  26.    Sql="DELETE * FROM Artek";
  27.    Db.ExecuteSQL(Sql);
  28. }
  29. catch(...)
  30. {[...]}
  31.  
  32.  
  33.  [...]
  34.  
  35.    //##################################################################################### BUCLE PRINCIPAL
  36.  
  37.    CString Insert;
  38.    MSG Msg;
  39.  
  40.    int NumInserts=0;
  41.  
  42.    do
  43.    {
  44.        if (PeekMessage(&Msg,NULL,0,0,PM_REMOVE))
  45.        {
  46.        TranslateMessage(&Msg);
  47.        DispatchMessage(&Msg);
  48.        }
  49.  
  50.        Sleep(3);
  51.  
  52.                                    //--------------- Leemos Linea
  53.        memset(Line,'\0',500);
  54.        n=Log->ReadLine(Line,500);              
  55.  
  56.  if (n<=0)
  57.            { Parse_Finished=true;break; }
  58.                            //---------------- Interpretar linea
  59.            n=0;
  60.            try{
  61.            n=sscanf(Line,"%s %s [%c] : %x\r\n",Date,Time,&Byte,&Hex);
  62.            }catch(...){           continue;         }
  63.                            //--------------- Insertar Linea si es valida
  64.            if (n!=4)
  65.            {[...]}
  66.            else
  67.            {
  68.            Hex=Hex&0x000000FF;
  69.            if (Hex<0xFE)
  70.            {                               if (Hex>=0x80)
  71.                {
  72.                Hex-=0x80;
  73.                Id_Obra=(int)Hex;
  74.                               try{
  75.                  if (Id_Obra<Registro.Obras.size() && Id_Obra>=0)
  76.                   sprintf(Obra_Nombre,"%s",Registro.Obras[Id_Obra].nombre);                                            }
  77.                    catch(...)
  78.                    {[...]}
  79.  
  80.                    if (Registro.Obras[Id_Obra].Tipo!=-1) //si no esta desactivada
  81.                    if (!(strcmp(Obra_Nombre,LastObra_Nombre)==0 && strcmp(Date,LastDate)==0 && strcmp(Time,LastTime)==0))
  82.                    {
  83.                    try{
  84.                        strcpy(LastObra_Nombre,Obra_Nombre); //----- si es la misma que la ultima incluso en el segundo
  85.                        strcpy(LastDate,Date);                //------ Ignorar
  86.                        strcpy(LastTime,Time);
  87.                        }
  88.                    catch(...)
  89.                        {[...]}
  90.  
  91.                       try
  92.                        {
  93.  
  94. //! aqui esta la insercion
  95.  
  96.                        Sql.Format("INSERT INTO Artek Id_Alarma,Id_Obra,Nombre_Obra,Fecha,Hora) VALUES (%d,%d,'%s','%s','%s')",ID++,Id_Obra,Obra_Nombre,Date,Time);
  97.                        Db.ExecuteSQL(Sql);        //---- la metemos en el Access
  98.                        Sql="";
  99.  
  100.                        }
  101.                    catch(CDBException * dbError)
  102.                        {[...] }
  103.                    catch(...)
  104.                        {[...] }
  105.                    }                                   }
  106.            }
  107.        }
  108.  
  109.    }while(Parse_Finished==0);
  110.  
  111.  
  112. //#####################################################################################
  113.  
  114. //_____________________________________________________________________________________________ Cerrar ACCESS
  115.    Log->Close();
  116.    Db.Close();
  117.  
  118. [... limpieza de otras cosas ...]
  119. }
  120.  
  121.  
  122.  


Espero que no sea mucha molestia de codigo, he eliminado todo lo no relacionado con la base de datos.
Es solo saber si hay algun paso para preparar la database o alguna cosa que hago mal que hace ese comportamiento.

Muchas gracias por anticipado por vuestro tiempo.

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
Re: Acelerar Procesamiento Cdatabase
« Respuesta #1 en: Miércoles 27 de Diciembre de 2006, 17:23 »
0
Bueno, aunque no era un fallo propiamente dicho, la linea en la que ponia en pantalla el numero de registro era la causante del misterioso comportamiento, y que curiosamente tambien habia eliminado por [...] al pensar que era codigo de lo mas simple.
Usaba un sprintf para escribir "procesados xxxx registros de xxxxx" y luego lo mandaba con un SetWindowText a su correspondiente Label. Lamentablemente eso provocaba la aparicion de multiples mensajes en la pila que no eran digeridos a suficiente velocidad.
La he eliminado y en su lugar hay una barra de progreso que se autoredibuja al ser ajustada, con lo que he ahorrado mucha carga al bucle principal.
Ahora va como el rayo.
Ya decia yo que el access estaba bien  <_< .