Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Optimizacion de Tiempo (https://www.clubdelphi.com/foros/showthread.php?t=26924)

Luis Alberto 07-11-2005 23:21:55

Optimizacion de Tiempo
 
Hola buenas tardes...

Mi problema consiste el lo siguiente....

Tengo dos Archivos .dat que me mandan y yo los tomo para actualizar una tabla que tengo en una base de datos.

El archivo dat son del cliente HP es algo asi :

125895-988|PQ|N/E|Lapices|N|N
7878AADF|PQ|N/E|Borradores|N|N

Asi son los registros que contiene el dat son 118196 registros...

Entonces con un Query extraigo de la tabla solamente los que son de ese cliente HP y por medio de parametro le paso el NUMERO DE PARTE


entonces si el numero de parte existe en la tabla, modifica 3 campos de la tabla con los datos que tiene el dat pero si no existe los agrega como nuevo

Entonces este proceso actualmente me lleva 16 horas realizarlo quiero ver si existe una posivilidad de optimizar dicho codigo....?



Las base de datos es Interbase


el codigo se los muestro a continuacion:
este codigo leo el archivo dat uno se llama Partes y otro Producto, iviemente primero leo uno y hago una consulta sql con el IBquery se que llama qParte: que dice asi:
Código Delphi [-]
 
DmPartes.qParte.Close;
     DmPartes.qParte.ParamByName  ('NOPARTE').Value:=NoParte;
     DmPartes.qParte.Active:=true;
     if DmPartes.qParte.IsEmpty=false then
       begin
         DmPartes.qParte.Edit;      
    
else 
Agregar....

como ven asi le paso por panametro a la sentencia SQL en Numero si existe edita los campos si no agregalo como nuevo..espero me entiendan...?

el codigo que sigue es como leo el dat....

Código Delphi [-]
 
while not Eof( archivo ) do begin
              If (bcancelar.Tag = 1) Then
                Break;
              // Lee una linea del archivo de texto
              Readln( archivo, linea );
              // Comprueba si tiene pipes, para saber si hay mas informacion
              if ( pos( '|', linea ) > 0 ) then begin
                 if Partes then begin
                    //try
                      for A := 1 to 8 do begin
                         SegundoPipe      := pos( '|', linea )                     ;
                         case a of
                         // No. de Parte
                         1: Noparte     :=Trim(copy( linea, 1, SegundoPipe -1 ))  ;
                         // PL
                         2: PL          :=Trim(copy( linea, 1, SegundoPipe -1 ))  ;
                         // Fraccion
                         3:
                         Begin
                             FracStr    := copy( linea, 1, SegundoPipe -1 )        ;
                             Fraccion   := 0                                       ;
                             If (FracStr <> 'N/E') and (Trim(FracStr) <> '') Then
                                Fraccion := StrToInt( FracStr )                    ;
                         End; {3}
                         // Descripcion
                         5: Descripcion := trim( copy( linea, 1, SegundoPipe -1 ) );
                         8: serie       := trim( copy( linea, 1, SegundoPipe -1 ) );
                         end; {Case}
                         Linea := Copy(Linea, SegundoPipe +1, 100)                 ;
                      end; // For
                    //except
                      //showmessage('Trono');
                    //end;
                    Opcion := ' ' ;
                    Tipo   := 'p' ;
                 end
                 else if Productos then begin
                    For A := 1 to 6 do begin
                        SegundoPipe := pos( '|', linea )                         ;
                        case a of
                        // No. de Parte
                        1: Noparte   := Trim(copy( linea, 1, SegundoPipe -1 ))   ;
                        // PL
                        2: PL        := Trim(copy( linea, 1, SegundoPipe -1 ))   ;
                        // Opcion
                        3: Opcion    := Trim(copy( linea, 1, SegundoPipe -1 ))   ;
                        // Fraccion
                        4: Begin
                           FracStr   := Trim(copy( linea, 1, SegundoPipe -1 ))   ;
                           Fraccion  := 0                                        ;
                           If (FracStr <> 'N/E') and (Trim(FracStr) <> '') Then
                              Fraccion  := StrToInt( FracStr )                   ;
                           End; {4}
                        // Descripcion
                        5: Descripcion:= trim( copy( linea, 1, SegundoPipe -1 ) );
                        // Serializado
                        6: serie      := trim( copy( linea, 1, SegundoPipe -1 ) );
                        end; {Case}
                        Linea := Copy(Linea, SegundoPipe + 1, 100)               ;
                    end; {For}
                    // Tipo
                    Tipo    := 'P';
                 end; // if productos

marcoszorrilla 08-11-2005 07:50:17

Pues 16 horas es un tiempo inadmisible, creo que habría que mirar otras posibilidades, pero tendrás que dar más datos, si el archivo es de tipo texto, se tardaría menos leyendo todos los registros y excluyendo directamente aquellos que no sean de HP, por ejemplo utilizando una Stringlist y luego pasarlos a la tabla.....

Un Saludo.

Casimiro Notevi 08-11-2005 08:57:14

Eso!!!, explicaciones detalladas ;)

Neftali [Germán.Estévez] 08-11-2005 09:40:57

¿Puedes poner el código que estás utilizando actualmente para recorrer el fichero y realizar las busquedas e inserciones?

¿Cual es la Base de Datos de destino?

Lepe 08-11-2005 10:54:13

Las 16 horas será porque está extrayendo a mano (cortando y pegando) los clientes del archivo, porque de otra forma es imposible.

Recuerda comentar, las tablas, campos, modo de acceso (bde, ado, ...) y la BBDD que usas.

saludos

Luis Alberto 08-11-2005 18:25:53

Para que me sirve ese componente

Luis Alberto 08-11-2005 18:26:47

Ya lo puse el codigo asi te sierve o que mas necesitarias para dyudarme?

jachguate 08-11-2005 18:42:43

Hola Luis Alberto.

Quiero cometnar que en estos foros, normalmente no se edita el mensaje para cambiar su contenido (por ejemplo, agregando el código, como lo has hecho esta vez). Si alguien pide el código, lo usual es ponerlo en un nuevo mensaje (en el mismo hilo) como este último que has escrito.

Esto favorece el que se entienda el desarrollo de los hilos para quienes no hemos participado en ellos y quienes lo encuentren en la búsqueda dentro de algunos años ;), pues al ver a Neftalí pedir el código en el mensaje #4, te desubica si ya has visto el código en el mensaje #1.

Luego, he editado tu mensaje para encerrar el código en la etiqueta [delphi], pues de la forma que lo has pegado resulta ilegible. Mas información sobre las etiquetas en los mensajes fijados al inicio de cada foro.

Hasta luego.

;)

lucasarts_18 08-11-2005 18:42:56

Cita:

Empezado por Luis Alberto
Ya lo puse el codigo asi te sierve o que mas necesitarias para dyudarme?

Trata de usar la etiquetas code (y le cambias la palabra code por delphi) para que el código sea mas legible y así poder comprender mas el problema y así tendrás más posibilidades de ayuda ;).

Hasta Luego -

jachguate 08-11-2005 19:01:29

Sobre tu problema... 100,000 registros debieran procesarse en cuestión de minutos. Para detectar cual es el cuello de botella, cronómetro en mano, revisá cuanto tiempo está tomando cada parte del proceso: Suponiendo que el comportamiento es líneal, está tomando mas o menos 0.5 segundos por registro.

digamos que el código:

Código Delphi [-]
while not finarchivo do
begin
  LeeLinea;
  InsertaRegistro;
end;

podemos cambiarlo por:

Código Delphi [-]
var
  t1, t2, t3 : TDateTime;
while not finarchivo do
begin
  t1 := now;
  LeeLinea;
  t2 := now;
  InsertaRegistro;
  t3 := now;
  memo1.lines.add(
    'tiempo lectura: %d ms.'#9 
    'tiempo insercion: %d', [
      trunc((t2 - t1) * 1000),
      trunc((t3 - t2) * 1000)]);
end;

Eso nos dará una idea de que está tardando. Estoy convencido que en tu caso, es la búsqueda del registro la que demora mucho tiempo... quizas el query (qparte) sea ineficiente.

Hasta luego.

;)

Luis Alberto 08-11-2005 21:32:06

Gracias por todos sus comentarios la verdad no he entrado mucho a los foros yu no entiendo mucho como se an podido dar cuenta....

jachguate 08-11-2005 21:50:00

Cita:

Empezado por Luis Alberto
no entiendo mucho como se an podido dar cuenta....

¿cómo nos hemos podido dar cuenta de que? :confused:
:rolleyes:

Luis Alberto 08-11-2005 22:12:17

Que casi no entroa foros y no se si hago las cosas bien en los foros...

vtdeleon 08-11-2005 22:16:24

Saludos
Cita:

Empezado por Luis Alberto
Que casi no entroa foros y no se si hago las cosas bien en los foros...

Entendido, por eso es que casi siempre hacemos énfasis en lean esto:
(Not) Guía de Estilo, Etiquetas vB:=Delphi-SQL

Casimiro Notevi 09-11-2005 01:11:34

La "cara" de vtdeleon lo expresa todo... :(, en fin, eso, la guía de estilo...


La franja horaria es GMT +2. Ahora son las 05:33:19.

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