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 Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-05-2008
Avatar de juanmdq
juanmdq juanmdq is offline
Miembro
 
Registrado: dic 2004
Posts: 52
Poder: 20
juanmdq Va por buen camino
Question ClientDataSet perdida de performance

Hola amigos del club.
Utilizando Delphi 7 y Oracle me ocurrió la siguiente interrogante cuando realizaba un proceso de importacion de archivo ascii a una tabla temporal plana, es decir, lo único que tiene la tabla es un campo 'renglon' de tipo varchar2 sin indices ni nada de nada.
Para el algoritmo utilizo un timer para actualizar un reloj y un thread que es el encargado de recorrer el ascii y cada cierta cantidad de renglones enviarlo a oracle.
El programa es +/- asi:
Código:
      AbrirArchivo(txt);
      dmDataModule.cdsArchivo.DisableControls;
      dmDataModule.cdsArchivo.Open;
      nrolinea := 0;
      while (not eof(txt)) and (not terminar) do
      begin
         nrolinea := nrolinea + 1;
         readln(txt, line);

         dmDataModule.cdsArchivo.Insert;
         dmDataModule.cdsArchivoRENGLON.AsString := line;
         dmDataModule.cdsArchivo.Post;

         if (nrolinea mod 1500) = 0 then
            dmDataModule.cdsArchivo.ApplyUpdates(-1);
      end;
      dmDataModule.cdsArchivo.Close;
Cuando importo archivos chicos, por ej. de 4MB el programa funciona genial, lo realiza bastante rapido.
Ahora bien, cuando intento importar un archivo de 180 MB se arrastra cual tortuga caminando en barro. Lo extraño es que arranca joya pero cada vez le cuesta mas completar los porcentajes, por ejemplo, del 1% al 2% lo hace en 1 min. el 9% al 10% lo hace en 2min. y asi va perdiendo en performance de forma bastante alarmante.

¿ Alguien tiene idea de a que se puede deber esto ?

Desde ya muchas gracias !
__________________
Al infierno se llega por atajos.
Responder Con Cita
  #2  
Antiguo 07-05-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Creo que se debe precisamente a que no usas indices en la base de datos. Prueba de colocar un campo id como indice principal para que el servidor pueda ordenarlo todo segun mejor le convenga. Ya diras... (PD: si usas Append en vez de Insert, o AppendRecord, te ira ligeramente mas rapido, pues directamente se va al final y no recoloca el cursor)
Responder Con Cita
  #3  
Antiguo 07-05-2008
tefots tefots is offline
Miembro
 
Registrado: feb 2005
Posts: 108
Poder: 20
tefots Va por buen camino
usa append en vez de insert , como ya te han dicho , con insert ha de recolocar el cursor y con append no , por eso cada vez le cuesta mas.

Tambien aceleraria bastante que en vez de tener un tquery con un select , uses la sentencia sql directamente , insert into table (xxx,xxx,xx) values (xx,xx,xx) y hagas un query.execsql. mas que nada porque no es optimo tener un query de 180mb o mas en memoria (va creciendo conforme vas insertando)

y en vez de usar el applyupdates (que no tiene mucho sentido usando un execsql) , inicies y finalices la transaaccion cada x registros.

salud2.
Responder Con Cita
  #4  
Antiguo 07-05-2008
Avatar de juanmdq
juanmdq juanmdq is offline
Miembro
 
Registrado: dic 2004
Posts: 52
Poder: 20
juanmdq Va por buen camino
Bueno, probe de cambiarle el insert por el append y mejoro algo aunque no lo suficiente.

Yo sigo intentando y cualquier cosa aviso.

Gracias por responder.
__________________
Al infierno se llega por atajos.
Responder Con Cita
  #5  
Antiguo 07-05-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
¡Hola a todos!

Te doy el mismo consejo que Tefots.

¿Por qué no ejecutar directamente las inserciones sobre la base de datos? ¿Realmente necesitas ese conjunto de datos en memoria con todos los registros transferidos?

Si por alguna razón necesitaras seguir usando un TClientDataSet, sin importar cual sea su contenido. Podrías intentar vaciándolo cada cierto número de registros transferidos.

Esperamos tus comentarios.

Saludos.

Al.
Responder Con Cita
  #6  
Antiguo 07-05-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Te doy unas cuantas ideas a ver si te van :

-quiza la velocidad se pierda debido a exceso de acceso a disco. Prueba de cargar todo el fichero de texto primero en memoria (no se si lo haces ahora mismo). Seguramente si lo cargas en un TMemo te lo explotará y lo deberas cargar dinamicamente tu a un String o a un puntero a string. (Memo1.LoadFromFile('fichero.txt'));

-Lo que te dije en el primer post. Lo has indexado? crea un campo id con indice, pues los servidores de BD a veces los usan internamente los indices para sus operaciones.

-Cambia todo a SQL y usa sentencias SQL.

Y si no necesitas la tabla, si solo es para cargar en ella el fichero de texto, entonces lo mejor es lo que te comente al principio : usa algun componente con strings directamente (TMemo, TStringList,etc...o un TStrings mismo, solo q tiene menos metodos y no se puede visualizar) y si los explota (180 MB son MB) entonces deberas programar a nivel de punteros.

Venga espero q te sirva.
Responder Con Cita
Respuesta



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
Perdida de Conexion Libarra MySQL 3 25-03-2008 17:40:31
Drag & Drop Performance... eddg Varios 0 02-10-2007 17:37:42
Performance de pagina en .Net fer21unmsm .NET 7 17-04-2007 00:56:42
Perdida de } Jack Varios 5 06-05-2004 16:44:50
perdida de librerias¡¡¡ YolandaM Varios 3 06-05-2004 11:07:22


La franja horaria es GMT +2. Ahora son las 12:05:54.


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
Copyright 1996-2007 Club Delphi