Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-04-2012
Chaja Chaja is offline
Miembro
 
Registrado: ago 2004
Ubicación: Mar del Plata
Posts: 214
Poder: 14
Chaja Va por buen camino
Ingresar 2.789.636 registro en una tabla de forma eficiente

Hola:
Bueno , tengo el siguiente esquema. Uso como motoro de BD Interbase 7.5 y prog. en Delphi 2007. Uso como conector DbExpress, y comoponetes ClientDataSet. Aca en argentina, los contribuyente que son Inscripto en la DGI, en algunos casos deben retener un impuesto adicional puede ser percepcion o retencio. La cosa es que la Direccion de rentas saca en forma mensual un padron de todos los contribuyente empadronados , con las tasas que correspone al mes en curso. El archivo biene en TXT, separado por comas cuyas columnas son :Fecha, vigencia, cuit, tasa_percepcion,tasa_retencion,vencimiento y otro mas que no biene al caso.
Bien yo lo lenanto despues de tener el archivo en la pc, con un ClientDataSet haciendo LoadFrom().
todo bien, y empiezo a procesarlo, llenando una y tabla con los mismo formatos de registro, (Fecha, vigencia, tasa,tasa..) amedida que voy leyendo disparo un sp en la base de datos y lo cargo. para saber como y por donde va hago una Application.processMesage, y voy mostradno en un label el numero de reg. pero mi inconveniente es que son 2.789.636 registros y tarda en cargar de 10horas y en lagunos casos 36 horas. la pregunat es, hay una forma mas eficiente de cargar tanta cantidad de reg en menos tiempo?

Gracias

Luis Roldan
Mar del Plata
Argentina
Responder Con Cita
  #2  
Antiguo 03-04-2012
Avatar de ElDioni
[ElDioni] ElDioni is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: Murcia (España)
Posts: 880
Poder: 13
ElDioni Va por buen camino
Hola,

lo primero que te diría es que me ha dado un poco de angustia leer tu petición por la forma en que te expresas y por las faltas de ortografía que tiene, tengo que ir descifrando lo que quieres decir, supongo que no seré el único al que le pase esto, lo segundo es que no das ninguna información de como lo estás haciendo, podrías poner algo de código, te podría decir que yo lo haría con una consulta insert pero a lo mejor ya lo estás haciendo.

Saludos.
__________________
Confórmate con lo que tienes pero anhela lo que te falta.
Responder Con Cita
  #3  
Antiguo 03-04-2012
Chaja Chaja is offline
Miembro
 
Registrado: ago 2004
Ubicación: Mar del Plata
Posts: 214
Poder: 14
Chaja Va por buen camino
Hola eldioni, gracias por tu tiempo, te pido disculpa, soy medio atolondrado para escribir. te paso el codigo.
con esto leo el txt:

Código Delphi [-]
procedure TFormTasasRet_Perc.SpeedButton1Click(Sender: TObject);
var Inicio:TDateTime;
begin
  inherited;
  if OpenDialog.Execute Then
    if OpenDialog.FileName<>'' Then
      begin
        Inicio:=Now;

        GifCarga.Visible:=True;
        GifCarga.Active :=True;
        edPath.Text:=OpenDialog.FileName;
        AssignFile(ArchiTxt, OpenDialog.FileName);
        Reset(ArchiTxt);
        MemoText.Lines.LoadFromFile(OpenDialog.FileName);
        lbReg.Caption:=IntToStr(MemoText.Lines.Count-1);
        lbTiempoLectua.Caption:=TimetoStr(inicio-now)
      end
    else
      ShowMessage('No hay archivo Seleccionado');
  GifCarga.Visible:=False;
  GifCarga.Active :=False;

end;

y con este hago el proceso de carga

Código Delphi [-]
procedure TFormTasasRet_Perc.LeerTxtExecute(Sender: TObject);
VAR S:String;
aux:Real;
posicion:Integer;
begin
  inherited;
  if MemoText.Lines.Count<=0 Then
    Raise Exception.Create('No hay datos para procesar...');
  GifProceso.Visible:=True;
  GifProceso.Animate:=True;
  if chbBorrarDatos.Checked then
    begin
      Borrar.Execute;
    end;
  CDSTasas.Close;
  CDSTasas.Open;
  btCancelar.Enabled:=True;
  btSalir.Enabled   :=False;
  if ComboBox1.ItemIndex=0 Then
    DecimalSeparator:=','
  else
  if ComboBox1.ItemIndex=1 Then
    DecimalSeparator:='.';

  lbinicio.Caption:=TimeToStr(Now);

  for posicion:=0 to MemoText.Lines.Count-1 do
    begin
      Application.ProcessMessages;
      lbNroReg.Caption:=IntToStr(posicion);
      Sleep(1);
      s:=MemoText.Lines[posicion];
      if cancelado=False Then
        begin
          CDSTasas.Append;
          CDSTasasFECHA.AsDateTime :=StrToDateTime(FormatDateTime('dd/mm/yyyy',StrToDate( (Copy(s,1,2)  +'/'+ Copy(s,3,2)  +'/'+ Copy(s,5,4) ))));
          CDSTasasDESDE.AsDateTime :=StrToDateTime(FormatDateTime('dd/mm/yyyy',StrToDate( (Copy(s,10,2) +'/'+ Copy(s,12,2) +'/'+ Copy(s,14,4) ))));
          CDSTasasHASTA.AsDateTime :=StrToDateTime(FormatDateTime('dd/mm/yyyy',StrToDate( (Copy(s,19,2) +'/'+ Copy(s,21,2) +'/'+ Copy(s,23,4) ))));
          CDSTasasCUIT.Value       :=Copy(s,28,2)+'-'+Copy(s,30,8)+'-'+copy(s,38,1);
          CDSTasasTIPO_CONVENIO.Value  := Copy(s,40,1);
          CDSTasasESTADO.Value         := Copy(S,42,1);
          CDSTasasCAMBIO_ALICUOTA.Value:= Copy(s,44,1);

          CDSTasasTASA_PERCEPCION.AsFloat := StrToFloat(copy(s,46,4));
          CDSTasasTASA_RETENCION.AsFloat  := StrToFloat(Copy(s,51,3));
          CDSTasasGRUPO_PERCEPCION.AsFloat:= StrToInt(Copy(s,56,2));
          CDSTasasGRUPO_RETENCION.AsFloat := StrToInt(Copy(s,59,2));

          CDSTasas.Post;

          spGravar.close;
          spGravar.ParamByName('cuit').Value    := CDSTasasCUIT.Value;
          spGravar.ParamByName('fecha').AsDate  := CDSTasasFECHA.AsDateTime;
          spGravar.ParamByName('desde').AsDate  := CDSTasasDESDE.AsDateTime;
          spGravar.ParamByName('hasta').AsDate  := CDSTasasHASTA.AsDateTime;
          spGravar.ParamByName('tipo').Value    := CDSTasasTIPO_CONVENIO.Value;
          spGravar.ParamByName('estado').Value  := CDSTasasESTADO.Value;
          spGravar.ParamByName('cambio').Value  := CDSTasasCAMBIO_ALICUOTA.Value;
          spGravar.ParamByName('tasa_perc').AsFloat := CDSTasasTASA_PERCEPCION.AsFloat;
          spGravar.ParamByName('tasa_ret').AsFloat  := CDSTasasTASA_RETENCION.AsFloat;

          spGravar.ParamByName('g_per').Value := CDSTasasGRUPO_PERCEPCION.Value;
          spGravar.ParamByName('g_ret').Value := CDSTasasGRUPO_RETENCION.Value;
          spGravar.ExecProc;
        end
      else
        if MessageDlg('cotinua ?',mtConfirmation, [mbYes, mbNo], 0) = mrYes then
          begin
            btCancelar.Enabled:=True;
            btSalir.Enabled   :=False;
            GifProceso.Visible:=True;
            GifProceso.Animate:=True;
            cancelado:=False;
          end
        else
          exit;
    end;
  DecimalSeparator:='.';
  GifProceso.Visible:=False;
  GifProceso.Animate:=False;
  lbfin.Caption:=TimeToStr(now);

  btCancelar.Enabled:=False;

  btSalir.Enabled   :=True;
end;


gracias

Última edición por Chaja fecha: 03-04-2012 a las 18:49:09.
Responder Con Cita
  #4  
Antiguo 03-04-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 27.701
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Pues sí, ha costado trabajo leerlo
Resumiendo, dices que lees un fichero de texto y que tarda 10 horas y otras veces 36 horas.

¿Y?

Edito: se te ha enrevesado el código
A ver si puedes arreglarlo, en caso contrario, envíalo a nuestro email y te lo copio y pego para que salga correctamente.
Responder Con Cita
  #5  
Antiguo 03-04-2012
Chaja Chaja is offline
Miembro
 
Registrado: ago 2004
Ubicación: Mar del Plata
Posts: 214
Poder: 14
Chaja Va por buen camino
ahi corregi el codigo que no se veia...
Responder Con Cita
  #6  
Antiguo 03-04-2012
jlrbotella jlrbotella is offline
Miembro
 
Registrado: ene 2007
Posts: 178
Poder: 11
jlrbotella Va por buen camino
Cool

1) Para leer un fichero tan grande no uses el componente tmemo. Puedes usar:
Código:
var f : TextFile;      
lineaactual : string; 
begin   
      AssignFile('c:\test.txt', f);   
      try     
           Append(f);     
           while not Eof do begin       
               Readln(f, lineaactual);  //creo que es así, busca en la ayuda de Delphi para asegurarte       
               //aqui haces lo que quieras con lineaactual     
          end;   
     finally     
          Closefile(f);   
     end; 
end;
2º He visto un sleep(1). Tienes que eliminarlo.
Responder Con Cita
  #7  
Antiguo 03-04-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 27.701
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por jlrbotella Ver Mensaje
1) Para leer un fichero tan grande no uses el componente tmemo. Puedes usar:
Código:
var f : TextFile;      
lineaactual : string; 
begin   
      AssignFile('c:\test.txt', f);   
      try     
           Append(f);     
           while not Eof do begin       
               Readln(f, lineaactual);  //creo que es así, busca en la ayuda de Delphi para asegurarte       
               //aqui haces lo que quieras con lineaactual     
          end;   
     finally     
          Closefile(f);   
     end; 
end;
2º He visto un sleep(1). Tienes que eliminarlo.
Me parece perfecto.
Además también quitaría el application.processmessages o que solamente lo hiciera cada ¿1000? registros.
Código Delphi [-]
if contador mod 100 then application.processmessages

Otra cosa, me ha parecido que lees a un clientdataset y luego sus valores lo pasas como parámetros a un stored procedure, ¿por qué no lo haces directamente?
Responder Con Cita
  #8  
Antiguo 04-04-2012
Chaja Chaja is offline
Miembro
 
Registrado: ago 2004
Ubicación: Mar del Plata
Posts: 214
Poder: 14
Chaja Va por buen camino
El CDS, lo puse para que el user vea como se carga... no se... y el memo lo puse para que se vea el archivo a cargar.
si el sleep() lo puedo sacar, aunque es un milisegundo ....mmmm....si pero si saco bien la cuenta son como 45 minutos no?
Responder Con Cita
  #9  
Antiguo 04-04-2012
Avatar de olbeup
olbeup olbeup is offline
Miembro
 
Registrado: jul 2005
Ubicación: Santiago de la Ribera (España)
Posts: 670
Poder: 13
olbeup Va camino a la fama
Por que no muestras de 1..10 registros de esos 2.789.636 que tienes para ver otra forma de ayudarte.
El motor que usas es Interbase 7.5 el mio es SQL SERVER 2005, en ocasiones tengo que incorporar un fichero de texto más o menos parecido al tuyo, sólo que éste es de combustible y lleva 7 campos que tengo que extraer, hay fichero que tienen 2095 registro y sólo dura en leerlo 1 segundo, en tu caso (2.789.636 / 2095) = (1.331,5685 / 60) = 22,224 Seg. NO 10..36 Horas.

En SQL SERVER se crean dos ficheros que se llaman schema.ini y dgi.txt en tu caso.

Estructuras del fichero schema.ini
Cita:
[dgi.txt]
ColNameHeader=True
Format=Delimited(,)
CharacterSet=ANSI
Col1=Fecha Date
Col2=Vigencia Date
Col3=Cuit Char 11
Col4=Tasa_Percepcion Double
Col5=Tasa_Retencion Double
Col6=Vencimiento Date
Líneas del fichero dgi.txt
Cita:
Fecha, Vigencia, Cuit, Tasa_percepcion, Tasa_retencion, Vencimiento
........, ..........., ....., ......................, ....................., ...............
........, ..........., ....., ......................, ....................., ...............
........, ..........., ....., ......................, ....................., ...............
Mira si puedes hacer algo parecido para Interbase

Un saludo
__________________
Al hacer una consulta SQL, haz que los demás te entiendan y disfruten de ella, será tú reflejo de tú saber.

Última edición por olbeup fecha: 04-04-2012 a las 10:15:59.
Responder Con Cita
  #10  
Antiguo 04-04-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 27.701
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Chaja Ver Mensaje
El CDS, lo puse para que el user vea como se carga... no se... y el memo lo puse para que se vea el archivo a cargar.
si el sleep() lo puedo sacar, aunque es un milisegundo ....mmmm....si pero si saco bien la cuenta son como 45 minutos no?
En un proceso de ese tipo, el estar mostrando información al usuario es perder tiempo. En todo caso una barra de progreso, no más.
Quita todo lo que no sirva, la carga en el CDS la quitas también, el sleep no es un milisegundo realmente, además de que no sirve para nada.
Resumiendo, lo más simple y eficaz.
Responder Con Cita
  #11  
Antiguo 04-04-2012
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.375
Poder: 16
fjcg02 Va camino a la fama
Además de eso, una sola instrucción insert parametrizada, para que la bbdd sólo la precompile una vez.


Saludos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #12  
Antiguo 04-04-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 27.701
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por fjcg02 Ver Mensaje
Además de eso, una sola instrucción insert parametrizada, para que la bbdd sólo la precompile una vez.
Saludos
También, esa llamada al 'stored procedure' no tiene pinta de ser muy efectiva.
Creo que sería mejor un ibsql/fibsql/etc. precompilada (.prepare).
Responder Con Cita
  #13  
Antiguo 04-04-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 9.881
Poder: 27
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Otra cosa que puede ayudar:
Código Delphi [-]
  if posicion mod 100 = 0 then
     CDSTasas.MergeChangeLog;

Saludos.

Edito: Una consulta, ¿ Las líneas tienen una longitud fija de caracteres ?
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 04-04-2012 a las 14:48:13.
Responder Con Cita
  #14  
Antiguo 04-04-2012
Chaja Chaja is offline
Miembro
 
Registrado: ago 2004
Ubicación: Mar del Plata
Posts: 214
Poder: 14
Chaja Va por buen camino
si la estructura del txt, es de tamaño fijo cada linea.
Voy a probar , sacare el Sp. y pondre un TSQLQUery, creia que era mas eficiente hacerlo con el storeProcedure, lo que no enentedi lo tuyo olbeup

Cita:
Por que no muestras de 1..10 registros de esos 2.789.636 que tienes para ver otra forma de ayudarte.
El motor que usas es Interbase 7.5 el mio es SQL SERVER 2005, en ocasiones tengo que incorporar un fichero de texto más o menos parecido al tuyo, sólo que éste es de combustible y lleva 7 .....
pruebo y aviso....
Responder Con Cita
  #15  
Antiguo 04-04-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 27.701
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Chaja Ver Mensaje
Voy a probar , sacare el Sp. y pondre un TSQLQUery, creia que era mas eficiente hacerlo con el storeProcedure, lo que no enentedi lo tuyo olbeup
En principio déjalo, haz pruebas y ya decides si usar uno u otro.
Responder Con Cita
  #16  
Antiguo 12-04-2012
Avatar de PepeLolo
PepeLolo PepeLolo is offline
Miembro
 
Registrado: jun 2003
Ubicación: Fuenlabrada - Madrid - Espagna
Posts: 260
Poder: 15
PepeLolo Va por buen camino
Para el proyecto "(DELT@) Declaración Electrónica de Trabajadores Accidentados" en el que trabaje, se realizaba la carga de un XML desmesurado. Lo que se hizo fue cargar el fichero en una tabla temporal de Oracle en este caso (para que sea más pequeña la carga del fichero txt, lo puedes realizar en partes más pequeñas). La carga real de los datos se realizaba en un SP (procedimiento almacenado).

Como se ejecuta todo en el servidor y no tiene que viajar información por la red, el tiempo que ganas es mucho.

un saludo.
__________________
PepeLolo
El hombre el único virus que mide más de unas cuantas micras
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
ingresar registro en delphi php y Mysql kurono PHP 1 06-06-2011 03:38:32
Alguna forma más eficiente de enviar HTML al navegador-cliente ??? chalao Internet 8 16-10-2008 19:23:03
Forma eficiente de manejar arrays de 10'000.000 cuadrados mamcx OOP 6 15-09-2006 22:01:12
¿Cómo Modificar un Registro de Tabla más Eficiente? MartinC MySQL 1 16-03-2005 15:04:31
Dar un valor a un registro en una tabla de forma automática vhirginia Conexión con bases de datos 3 26-04-2004 20:50:42


La franja horaria es GMT +2. Ahora son las 20:34:15.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi