![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
|||
|
|||
|
Proceso demasiado lento
Buenas, he creado una aplicación con c++ builder 6 que lee un archivo csv y lo carga en un Memo, despues revisa una base de datos en access 2007 para comprobar que los datos de este csv no esten en la base de datos y los va introduciendo, mi problema es que manejo demasiada cantidad de datos , actualmente son unos 9000 registros, con lo cual, al recorrer la base de datos con cada inserción me tarda demasiado, no se como agilizar este proceso y si alguno tiene alguna idea de como hacer que esto sea mas rapido me seria de gran ayuda, gracias de antemano
. |
|
#2
|
||||
|
||||
|
Tu explicación es muy genérica, deberías explicar ampliamente cómo lo haces, poner código, etc.
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
|
#3
|
|||
|
|||
|
OK ahi va el codigo:
Código:
void __fastcall TXPrincipal::ToolButton2Click(TObject *Sender)
{
if(OpenDialog1->Execute())
{
int col =0;
int cont=0;
String referencia ="";
Memo1->Lines->LoadFromFile(OpenDialog1->FileName);
//Muestro la con un ProgressBar la carga de un StringGrid donde organizo los datos del Memo
XCarga->Show();
XCarga->ProgressBar1->Min = 0;
XCarga->ProgressBar1->Max = Memo1->Lines->Count;
for (int i =0; i <= Memo1->Lines->Count; i++)
{
XCarga->ProgressBar1->Position = i;
for (int j=1; j<= Memo1->Lines->Strings[i].Length();j++)
{
if (Memo1->Lines->Strings[i][j] == ';')
{
if (referencia != "")
StringGrid1->Cells[col][i] = referencia;
referencia = "";
col++;
cont++;
if (cont>60)
{
cont =0;
col=0;
break;
}
}
if (Memo1->Lines->Strings[i][j] != ';')
{
referencia = referencia +Memo1->Lines->Strings[i][j];
}
}
}
}
// StringGrid Cargado
XCarga->Close();
XDatos->TCategorias->Open();
XDatos->TSubCat1->Open();
XDatos->TSubCat2->Open();
XDatos->TSubCat3->Open();
XDatos->TMarcas->Open();
XDatos->QRecorreProductos->Open();
XDatos->TCaracteristicas->Open();
// abro las tablas y consultas que voy a necesitar
bool existe = false;
int cont=0;
XCarga->Show();
XCarga->ProgressBar1->Min = 1;
XCarga->ProgressBar1->Max = StringGrid1->RowCount;
//Recorro el StringGrid
for (int f=1;f<=StringGrid1->RowCount;f++)
{
XCarga->ProgressBar1->Position = f;
existe = false;
XDatos->QRecorreProductos->First();
//Recorro la tabla de productos con una Query para comprobar que el producto no este ya en la BD
while (!XDatos->QRecorreProductos->Eof)
{
if (XDatos->QRecorreProductosREFERENCIA->Value == StringGrid1->Cells[0][f])
existe = true;
XDatos->QRecorreProductos->Next();
}
if (!existe && StringGrid1->Cells[0][f]!="")
{
// Si no existe ya y el campo del StringGrid correspondiente a la referencia no esta vacio
// Comienzo a asignar valores al nuevo producto
XDatos->QProductos->Append();
XDatos->QProductosREFERENCIA->Value = StringGrid1->Cells[0][f];
XDatos->QProductosESTADO->Value = StringGrid1->Cells[1][f];
bool esta=false;
XDatos->TCategorias->First();
// compruebo k la categoria exista, si no es asi la añado
while(!XDatos->TCategorias->Eof)
{
if (StringGrid1->Cells[2][f] == XDatos->TCategoriasCATEGORIA->Value)
{
XDatos->QProductosCATEGORIA->Value=XDatos->TCategoriasCodCategoria->Value;
{
esta=true;
}
}
XDatos->TCategorias->Next();
}
if (!esta)
{
XDatos->TCategorias->Append();
XDatos->TCategoriasCATEGORIA->Value = StringGrid1->Cells[2][f];
XDatos->TCategorias->Post();
XDatos->QProductosCATEGORIA->Value=XDatos->TCategoriasCodCategoria->Value;
}
bool esta2=false;
XDatos->TSubCat1->First();
// compruebo k la SubCategoria1 exista, si no es asi la añado
while(!XDatos->TSubCat1->Eof)
{
if (XDatos->TSubCat1CATEGORIA->Value == XDatos->QProductosCATEGORIA->Value && XDatos->TSubCat1SUBCAT1->Value == StringGrid1->Cells[3][f] && XDatos->TSubCat1->FieldByName("SUBCAT1") != "")
{
XDatos->QProductosSUBCAT1->Value= XDatos->TSubCat1CodSUBCAT1->Value;
esta2=true;
}
XDatos->TSubCat1->Next();
}
if (!esta2)
{
XDatos->TSubCat1->Append();
XDatos->TSubCat1SUBCAT1->Value = StringGrid1->Cells[3][f];
XDatos->TSubCat1CATEGORIA->Value = XDatos->QProductosCATEGORIA->Value;
XDatos->TSubCat1->Post();
XDatos->QProductosSUBCAT1->Value= XDatos->TSubCat1CodSUBCAT1->Value;
}
bool esta3=false;
XDatos->TSubCat2->First();
// compruebo k la SubCategoria2 exista, si no es asi la añado
while(!XDatos->TSubCat2->Eof)
{
if (XDatos->TSubCat2SUBCAT1->Value == XDatos->QProductosSUBCAT1->Value && XDatos->TSubCat2SUBCAT2->Value == StringGrid1->Cells[4][f] && XDatos->TSubCat2->FieldByName("SUBCAT2") != "")
{
XDatos->QProductosSUBCAT2->Value = XDatos->TSubCat2CodSUBCAT2->Value;
esta3=true;
}
XDatos->TSubCat2->Next();
}
if (!esta3)
{
XDatos->TSubCat2->Append();
XDatos->TSubCat2SUBCAT2->Value = StringGrid1->Cells[4][f];
XDatos->TSubCat2SUBCAT1->Value = XDatos->QProductosSUBCAT1->Value;
XDatos->TSubCat2->Post();
XDatos->QProductosSUBCAT2->Value = XDatos->TSubCat2CodSUBCAT2->Value;
}
bool esta4=false;
XDatos->TSubCat3->First();
// compruebo k la SubCategoria1 exista, si no es asi la añado
while(!XDatos->TSubCat3->Eof)
{
if (XDatos->TSubCat3SUBCAT2->Value == XDatos->QProductosSUBCAT2->Value && XDatos->TSubCat3SUBCAT3->Value == StringGrid1->Cells[5][f] && XDatos->TSubCat3->FieldByName("SUBCAT3") != "")
{
XDatos->QProductosSUBCAT3->Value = XDatos->TSubCat3CodSUBCAT3->Value;
esta4=true;
}
XDatos->TSubCat3->Next();
}
if (!esta4)
{
XDatos->TSubCat3->Append();
XDatos->TSubCat3SUBCAT3->Value = StringGrid1->Cells[5][f];
XDatos->TSubCat3SUBCAT2->Value = XDatos->QProductosSUBCAT2->Value;
XDatos->TSubCat3->Post();
XDatos->QProductosSUBCAT3->Value = XDatos->TSubCat3CodSUBCAT3->Value;
}
XDatos->QProductosPRODUCTO->Value = StringGrid1->Cells[6][f];
XDatos->QProductosKEY->Value = StringGrid1->Cells[7][f];
bool esta5=false;
XDatos->TMarcas->First();
// compruebo k la Marca exista, si no es asi la añado
while(!XDatos->TMarcas->Eof)
{
if (XDatos->TMarcasMARCA->Value == StringGrid1->Cells[8][f])
{
XDatos->QProductosMARCA->Value = XDatos->TMarcasCodMARCA->Value;
esta5=true;
}
XDatos->TMarcas->Next();
}
if (!esta5)
{
XDatos->TMarcas->Append();
XDatos->TMarcasMARCA->Value = StringGrid1->Cells[8][f];
XDatos->TMarcas->Post();
XDatos->QProductosMARCA->Value = XDatos->TMarcasCodMARCA->Value;
}
XDatos->QProductosDESCRIPCION->Value = StringGrid1->Cells[9][f];
XDatos->QProductosFOTOS->Value = StringGrid1->Cells[10][f];
XDatos->QProductosCATEGORIAX->Value = StringGrid1->Cells[11][f];
XDatos->QProductosCATEGORIAS->Value = StringGrid1->Cells[12][f];
//Confirmo el insert de productos
XDatos->QProductos->Post();
// A partir de aqui los datos son de la tabla caracteristicas
for(int c=13;c<=StringGrid1->ColCount;c++)
{
if (StringGrid1->Cells[c][f]!="")
{
if (c % 2 !=0)
{
XDatos->TCaracteristicas->Append();
XDatos->TCaracteristicasCATEGORIA->Value = XDatos->QProductosCATEGORIA->Value;
XDatos->TCaracteristicasSUBCAT1->Value = XDatos->QProductosSUBCAT1->Value;
XDatos->TCaracteristicasSUBCAT2->Value = XDatos->QProductosSUBCAT2->Value;
XDatos->TCaracteristicasSUBCAT3->Value = XDatos->QProductosSUBCAT3->Value;
XDatos->TCaracteristicasref->Value = XDatos->QProductosREFERENCIA->Value;
XDatos->TCaracteristicasCARACTERISTICA->Value = StringGrid1->Cells[c][f];
XDatos->TCaracteristicasVALOR->Value = StringGrid1->Cells[c+1][f];
// Confirmo la insercion de datos en caracteristicas
XDatos->TCaracteristicas->Post();
}
}
}
//Cuento las veces que aparece un espacio sin datos en el StringGrid
if (StringGrid1->Cells[0][f]=="")
cont ++;
//Si aparecen mas de 100 espacios corto el proceso
if (cont > 100)
break;
}
}
XDatos->QRecorreProductos->Close();
DBGrid1->Refresh();
}
Soy bastante novato y provablemen te esto se podria hacer de alguna forma mas sencilla, no lo se, pero lo que me tarda es abusivo, gracias por contestar tan rapido ![]() |
|
#4
|
||||
|
||||
|
Para saber si un registro existe o no, deberías preguntarlo directamente a la base y no recorrer cada registro y comparar.
Esta parte Código:
//Recorro la tabla de productos con una Query para comprobar que el producto no este ya en la BD
while (!XDatos->QRecorreProductos->Eof)
{
if (XDatos->QRecorreProductosREFERENCIA->Value == StringGrid1->Cells[0][f])
existe = true;
XDatos->QRecorreProductos->Next();
}
No conozco como hacerlo en C, pero sería algo así: Código:
// Ejecuto query que cuentas cuantos registros tienen referencia=[lo que busco]
XQueryExisteDato->SQL->Text = 'SELECT COUNT(*) FROM DATOS WHERE REFERECIA='||StringGrid1->Cells[0][f];
XQueryExisteDato->ExecSQL;
// Si existe la cuenta será mayor a 0
if (XQueryExisteDato->FieldByName('COUNT')->Value > 0)
{existe = true;}
|
|
#5
|
|||
|
|||
|
Muchas gracias
Probare a hacerlo de esa forma, usando consultas a ver si se agiliza el proceso y os comento.
Gracias de nuevo por la ayuda ![]() |
|
#6
|
||||
|
||||
|
Creo que es un código perfecto para utilizar un profiler (aquí hay algunos). Con estos programas puedes saber exactamente qué parte de tu programa es la que está tardando más tiempo. Las lecturas, algún procedimiento con strings,...
Con eso podrás saber exactamente a qué parte tienes que atacar para optimizar.
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi ![]() P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
![]() |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| CreateForm demasiado lento | kverna | Varios | 6 | 06-03-2008 14:32:14 |
| Procedure en Firebird lento o IbQuery lento | capo979 | Firebird e Interbase | 14 | 17-07-2007 21:35:36 |
| Demasiado lento programa | Manuel | Varios | 1 | 27-10-2005 18:10:08 |
| Proceso lento al dar enter sobre un boton | Walterdf | Varios | 1 | 05-04-2005 18:20:50 |
| Interbase demasiado lento | diegofhernando | Conexión con bases de datos | 2 | 12-09-2003 22:05:24 |
|