Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Tablas planas (https://www.clubdelphi.com/foros/forumdisplay.php?f=20)
-   -   Importacion en una Tabla (https://www.clubdelphi.com/foros/showthread.php?t=90321)

rocksoft 17-05-2016 23:18:33

Importacion en una Tabla
 
Buenas a todos,

tengo una consulta para saber como voy:

Resumiendo tengo un archivo *.txt que pesa 1.132,00 MB con 10.704.759,00 de lineas, cada linea tiene 15 campos separados por "|" en formato unix, en promedio 150 caracteres.
Ahora voy leyendo linea por linea convirtiendola en formato windows y eliminando las impurezas signos de mas etc.
empiezo a importar la linea en una tabla DBIsam, por el momento consigo importar una 1500 lineas por segundo, lo que me lleva a esperar casi dos horas hasta que esten los
10.7 Millones de lineas importadas.

a mi consulta, son tiempos razonables o creen que podria ser mas rapida la importacion?

AgustinOrtu 17-05-2016 23:41:52

El unico que tiene criterio es el usuario final

Ademas si es un proceso que se ejecuta una vez al mes yo te diria "no hay problema". Si lo tengo que hacer 3 veces por dia, me molestaria bastante

Publica el codigo asi entre todos vemos que se puede mejorar

Casimiro Notevi 18-05-2016 00:30:33

Además falta muchísima información para poder ayudar/opinar.
No sabemos cómo lees las líneas, cómo las guardas, con qué componentes, estructura de la tabla, parámetros de configuración, etc. etc. etc. ...

rocksoft 18-05-2016 03:59:23

Hola a todos,

lo que pido es un valor referencial, si alguien me dice que importa 10 millones de registros en 10 minutos se que algo estoy haciendo mal :)

Haber si optimizo el codigo mañana y lo pongo :)

AgustinOrtu 18-05-2016 05:55:50

Es que una cosa es importar "copiar y pegar" y otra cosa es "leer un archivo, procesar x informacion, guardar"

adebonis 18-05-2016 06:47:59

Hola.

Las tablas DBIsam tienen la función ImportTable. ¿La has probado?

Adolfo de Bonis.

Casimiro Notevi 18-05-2016 09:36:14

Es que no son cosas comparables, por eso te hemos respondido esto:
Cita:

Empezado por AgustinOrtu (Mensaje 505288)
El unico que tiene criterio es el usuario final
Ademas si es un proceso que se ejecuta una vez al mes yo te diria "no hay problema". Si lo tengo que hacer 3 veces por dia, me molestaria bastante
Publica el codigo asi entre todos vemos que se puede mejorar

Cita:

Empezado por Casimiro Notevi (Mensaje 505289)
Además falta muchísima información para poder ayudar/opinar.
No sabemos cómo lees las líneas, cómo las guardas, con qué componentes, estructura de la tabla, parámetros de configuración, etc. etc. etc. ...

Cita:

Empezado por AgustinOrtu (Mensaje 505291)
Es que una cosa es importar "copiar y pegar" y otra cosa es "leer un archivo, procesar x informacion, guardar"


bitbow 19-05-2016 17:42:58

Te puedo decir que yo exporto 20,000 registros de SQL Server a Oracle en 3 horas (Cada servidor con distinta locacion y conexión), viendo tus cifras realmente tu proceso no es lento, como dices tendria que aparecer alguien y decir que ese proceso lo ha conseguido correr en 10 min. , mientras no aparezca creo que vas por buen camino (y si aparece que nos diga como).

Saludos.

rocksoft 20-05-2016 18:50:13

Buenas con todos,

Cita:

Empezado por adebonis (Mensaje 505294)
Hola.
Las tablas DBIsam tienen la función ImportTable. ¿La has probado?
Adolfo de Bonis.

Si ya lo probe, pero no es una opcion ya que no valida la informacion y a la mas minima salta un error, ya que los datos a importar no son de fiar, de vez en cuando tienen un campo mas, o un delimitador doble etc..

Pero les comento de que 1500 por segundo son muy lentos, me puse a analizar proceso por proceso y midiendo paso por paso los tiempos de resultado, la parte lenta el desgloce del string en sus respectivos campos, usaba un stringlist con delimitador, ahora con un array es bastante mas rapido.

Otros dos puntos que relentizaba el proceso era en contador de registros leidos y la barra de avance (aunque paresca una tontaria cuestan tiempo) en 10.000 registros hacen la diferencia de 1-3 segundos.

Ahora estoy importando unos 14.000 registros por segundo, lo que tardaba importar 10.7 Millones de registros unas 3 horas, ahora tarda unos 15 min.

bueno les dejo el spliter por si alguien le sirve, no soy el autor lo encontre buscando :

Código Delphi [-]
function Split00(const Texto, Delimitador: string): TSarray;
var
  i: integer;
  Len: integer;
  PosStart: integer;
  PosDel: integer;
begin
  i := 0;
  SetLength(result, 1);
  Len := Length(Delimitador);
  PosStart := 1;
  PosDel := Pos(Delimitador, Texto);
  while PosDel > 0 do
  begin
    result[i] := Copy(Texto, PosStart, PosDel - PosStart);
    PosStart := PosDel + Len;
    PosDel := Pos(Delimitador, Texto, PosStart);
    Inc(i);
    SetLength(result, i + 1);
  end;
  result[i] := Copy(Texto, PosStart, Length(Texto));
end;

bitbow 20-05-2016 19:14:39

Aplausos para este compañero, es una pena que el SplitString sea tan lento, se me olvido mencionarte eso en el pos anterior, yo igual hice ese cambio y el tiempo de proceso disminuye bastante.

Una duda, como estas insertando los registros? uno por uno o por bloques?

Saludos.

rocksoft 21-05-2016 03:48:16

Hola bitbow,

probe las dos variantes y por bloques en sql de 1000 en 1000 iba bastante mas lento que de uno en uno, ya que tengo los datos directos para insertar, en bloques los tengo que ir guardando en y volver a leer. Ahora escribiendo lo que no probe es usando el comando prepare, podria ser ayude, pero ya no voy a cambiar nada mas, al menos por el momento.

Ahora descargando el archivo, descomprimir, leer linea por linea e importarla acabo en 15-20 min :)


La franja horaria es GMT +2. Ahora son las 07:13:53.

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