Programación General > Visual C++
Acelerar Procesamiento Cdatabase
(1/1)
diego.martinez:
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 --- #define WINVER 0x0501CDatabase Db;CString sFile = "access.mdb"; int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd){ CString sDsn; CString Sql; CString sDriver = "MICROSOFT ACCESS DRIVER (*.MDB)"; sDsn.Format("ODBC;DRIVER=Microsoft Access Driver (*.mdb);DSN='';DBQ=%s",sFile); [...] //________________________ APERTURA DE DATABASEtry{ Db.Open(NULL,false,false,sDsn);}catch(CDBException* dbError){[...]}catch(...){[...]}try{ Sql="DELETE * FROM Artek"; Db.ExecuteSQL(Sql);}catch(...){[...]} [...] //##################################################################################### BUCLE PRINCIPAL CString Insert; MSG Msg; int NumInserts=0; do { if (PeekMessage(&Msg,NULL,0,0,PM_REMOVE)) { TranslateMessage(&Msg); DispatchMessage(&Msg); } Sleep(3); //--------------- Leemos Linea memset(Line,'\0',500); n=Log->ReadLine(Line,500); if (n<=0) { Parse_Finished=true;break; } //---------------- Interpretar linea n=0; try{ n=sscanf(Line,"%s %s [%c] : %x\r\n",Date,Time,&Byte,&Hex); }catch(...){ continue; } //--------------- Insertar Linea si es valida if (n!=4) {[...]} else { Hex=Hex&0x000000FF; if (Hex<0xFE) { if (Hex>=0x80) { Hex-=0x80; Id_Obra=(int)Hex; try{ if (Id_Obra<Registro.Obras.size() && Id_Obra>=0) sprintf(Obra_Nombre,"%s",Registro.Obras[Id_Obra].nombre); } catch(...) {[...]} if (Registro.Obras[Id_Obra].Tipo!=-1) //si no esta desactivada if (!(strcmp(Obra_Nombre,LastObra_Nombre)==0 && strcmp(Date,LastDate)==0 && strcmp(Time,LastTime)==0)) { try{ strcpy(LastObra_Nombre,Obra_Nombre); //----- si es la misma que la ultima incluso en el segundo strcpy(LastDate,Date); //------ Ignorar strcpy(LastTime,Time); } catch(...) {[...]} try { //! aqui esta la insercion 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); Db.ExecuteSQL(Sql); //---- la metemos en el Access Sql=""; } catch(CDBException * dbError) {[...] } catch(...) {[...] } } } } } }while(Parse_Finished==0); //##################################################################################### //_____________________________________________________________________________________________ Cerrar ACCESS Log->Close(); Db.Close(); [... limpieza de otras cosas ...]}
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:
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 <_< .
Navegación
Ir a la versión completa