Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-07-2011
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.705
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
Entonces cuento 21 caracteres más cr+lf = 23 por línea.
Si son 5 millones de registros hacen: 115.000.000 bytes= 109 MB.
No es que sea algo muy abrumador, aunque me pregunto por qué lo cargas en memoria, ¿por qué no usas una tabla para ello?.
Responder Con Cita
  #2  
Antiguo 07-07-2011
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 26
maeyanes Va por buen camino
Otra cosa que podrías hacer es ir leyendo los datos en bloques, o sea, lees primero unas 1,000 líneas (o 10,000) y las procesas, luego lees otro bloque de n líneas y lo procesas y así hasta finalizar...


Saludos...
__________________
Lee la Guía de Estilo antes que cualquier cosa. - Twitter
Responder Con Cita
  #3  
Antiguo 07-07-2011
pelikno pelikno is offline
Miembro
NULL
 
Registrado: oct 2010
Posts: 95
Poder: 16
pelikno Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Entonces cuento 21 caracteres más cr+lf = 23 por línea.
Si son 5 millones de registros hacen: 115.000.000 bytes= 109 MB.
No es que sea algo muy abrumador, aunque me pregunto por qué lo cargas en memoria, ¿por qué no usas una tabla para ello?.
El Archivo es de 85 mgb, por lo de la memoria vos decis que lo cargue en un ttable?
Responder Con Cita
  #4  
Antiguo 07-07-2011
pelikno pelikno is offline
Miembro
NULL
 
Registrado: oct 2010
Posts: 95
Poder: 16
pelikno Va por buen camino
Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);

var
  Fichero: File of byte;
  Buffer: array[0..21] of Char; // 22 bytes + 1
  Leidos: Integer;
  Str: string;
  b:byte;
  i:integer;
begin
i:=0;
  AssignFile(Fichero,'C:\Temp\SELE-SAL-CONSTA.tmp');
  Filemode:= fmOpenRead;
   Memory.Active:=true;
  {$I-}
    Reset(Fichero);// Reset(Fichero,1);
  {$I+}
  Timer1.Enabled:= true;
  if IOResult = 0 then
  begin

    while not  eof(Fichero) do
    begin
      FillChar(Buffer,Sizeof(Buffer),0);
      BlockRead(Fichero,Buffer,Sizeof(Buffer)-1,Leidos);
      read(fichero,b);
      if Leidos > 0 then
      begin
        Str:= String(PChar(@Buffer));
         i:=i+1;
         Label1.Caption:=inttostr(i);
        CargarGrilla(Str);
      end;
    end;
    Timer1.Enabled:=false;
    CloseFile(Fichero);
  end else
    ShowMessage('No puedo abrir el archivo');
end;

este es el codigo, el tema que tego que actualizar mi base con este txt, como me recomiendan que la cargue o donde, my base es sqlserver.
Gracias!!
Responder Con Cita
  #5  
Antiguo 07-07-2011
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 26
maeyanes Va por buen camino
Hola...

¿Es necesario que cargues la información en un grid?


Saludos...
__________________
Lee la Guía de Estilo antes que cualquier cosa. - Twitter
Responder Con Cita
  #6  
Antiguo 07-07-2011
pelikno pelikno is offline
Miembro
NULL
 
Registrado: oct 2010
Posts: 95
Poder: 16
pelikno Va por buen camino
Cita:
Empezado por maeyanes Ver Mensaje
Hola...

¿Es necesario que cargues la información en un grid?


Saludos...
No no solamente la ponia para ver como armaba el contenido ... y supongo que eso es lo que me tilda todo el sistema.
Responder Con Cita
  #7  
Antiguo 07-07-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
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 beholdecfisa is a splendid one to behold
Hola pelikno.

En el código que adjuntas (#14), para recorrer 100000 registros realiza 100000 ciclos de lectura, que es muchisimo mejor que el primer código que leia caracter a caracter(#8), ya que en ese caso eran 100000 x 22 lecturas. Pero creo que se puede optimizar mucho más el código de lectura en bloque.

No tengo acceso a los datos y puede que tengas que cambiar la cantidad de caracteres por registro o algún detalle que se me escape por no tener el archivo origen o el formato requerido.
Código Delphi [-]
...
const
  NCHAR = 22;
  LEER_X = 20000 ;
  TOT_BUFFER = LEER_X * NCHAR;

procedure TForm1.btnACDSClick(Sender: TObject);
var
  F: file of Char;
  Buf: array[1..TOT_BUFFER] of Char;
  c, rl: Integer;
  T1,T2: TTime;
  Ciclos: Integer;
begin
  AssignFile(F, 'C:\Archivo.txt');
  try
    Reset(file(F), 1);
    ClientDataSet.CreateDataSet;
    ClientDataSet.Open;
    ClientDataSet.DisableControls;
    T1:= Time;
    Ciclos:= 1;
    repeat
      BlockRead(file(F), Buf, SizeOf(Buf), rl);
      c:= 0;
      while c < TOT_BUFFER do
      begin
        if c mod 100 = 0 Then 
          ClientDataSet.MergeChangeLog;
        ClientDataSet.Append;
        ClientDataSetCuit.AsString:= Buf[c+1]+Buf[c+2]+Buf[c+3]+
            Buf[c+4]+Buf[c+5]+Buf[c+6]+Buf[c+7]+Buf[c+8]+Buf[c+9]+
            Buf[c+10]+Buf[c+11];
        ClientDataSetD1.AsString:= Buf[c+12]+Buf[c+13];
        ClientDataSetD2.AsString:= Buf[c+14]+Buf[c+15];
        ClientDataSetD3.AsString:= Buf[c+16]+Buf[c+17];
        ClientDataSetD4.AsString:= Buf[c+18];
        ClientDataSetD5.AsString:= Buf[c+19];
        Inc(c, NCHAR);
        ClientDataSet.Post;
      end;
      Inc(Ciclos);
    until rl = 0;
    CloseFile(F);
    T2:= Time;
    Caption:= FormatDateTime('hh:mm:ss:dd',T2-T1)+'  realizando '+IntToStr(Ciclos)+' ciclos.';
    ClientDataSet.EnableControls;
  except
    ShowMessage('Archivo inexistente');
  end;
end;
En este caso, con 100000 registros sólo realiza 7 ciclos en 00:00:05:30 (en mi equipo).

Como no tengo ni conozco el RxMemoryData, usé un TClientDataSet para la prueba. Lo único que tenés que hacer es crear los campos persistentes en él respetando los nombres y el código debería funcionarte.
Cualquier dificultad te adjunto el ejemplo con el generador de datos.

Saludos.
__________________
Daniel Didriksen

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

Última edición por ecfisa fecha: 07-07-2011 a las 22:46:54.
Responder Con Cita
  #8  
Antiguo 08-07-2011
pelikno pelikno is offline
Miembro
NULL
 
Registrado: oct 2010
Posts: 95
Poder: 16
pelikno Va por buen camino
Cita:
Empezado por ecfisa Ver Mensaje
Hola pelikno.

En el código que adjuntas (#14), para recorrer 100000 registros realiza 100000 ciclos de lectura, que es muchisimo mejor que el primer código que leia caracter a caracter(#8), ya que en ese caso eran 100000 x 22 lecturas. Pero creo que se puede optimizar mucho más el código de lectura en bloque.

No tengo acceso a los datos y puede que tengas que cambiar la cantidad de caracteres por registro o algún detalle que se me escape por no tener el archivo origen o el formato requerido.
Código Delphi [-]... const NCHAR = 22; LEER_X = 20000 ; TOT_BUFFER = LEER_X * NCHAR; procedure TForm1.btnACDSClick(Sender: TObject); var F: file of Char; Buf: array[1..TOT_BUFFER] of Char; c, rl: Integer; T1,T2: TTime; Ciclos: Integer; begin AssignFile(F, 'C:\Archivo.txt'); try Reset(file(F), 1); ClientDataSet.CreateDataSet; ClientDataSet.Open; ClientDataSet.DisableControls; T1:= Time; Ciclos:= 1; repeat BlockRead(file(F), Buf, SizeOf(Buf), rl); c:= 0; while c < TOT_BUFFER do begin if c mod 100 = 0 Then ClientDataSet.MergeChangeLog; ClientDataSet.Append; ClientDataSetCuit.AsString:= Buf[c+1]+Buf[c+2]+Buf[c+3]+ Buf[c+4]+Buf[c+5]+Buf[c+6]+Buf[c+7]+Buf[c+8]+Buf[c+9]+ Buf[c+10]+Buf[c+11]; ClientDataSetD1.AsString:= Buf[c+12]+Buf[c+13]; ClientDataSetD2.AsString:= Buf[c+14]+Buf[c+15]; ClientDataSetD3.AsString:= Buf[c+16]+Buf[c+17]; ClientDataSetD4.AsString:= Buf[c+18]; ClientDataSetD5.AsString:= Buf[c+19]; Inc(c, NCHAR); ClientDataSet.Post; end; Inc(Ciclos); until rl = 0; CloseFile(F); T2:= Time; Caption:= FormatDateTime('hh:mm:ss:dd',T2-T1)+' realizando '+IntToStr(Ciclos)+' ciclos.'; ClientDataSet.EnableControls; except ShowMessage('Archivo inexistente'); end; end;

En este caso, con 100000 registros sólo realiza 7 ciclos en 00:00:05:30 (en mi equipo).

Como no tengo ni conozco el RxMemoryData, usé un TClientDataSet para la prueba. Lo único que tenés que hacer es crear los campos persistentes en él respetando los nombres y el código debería funcionarte.
Cualquier dificultad te adjunto el ejemplo con el generador de datos.

Saludos.
Muchas Graciasecfisa por tomarte el tiempo de hacer el codigo mañana lo pruebo y veo que pasa.
SALUDOS!!!
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
ayuda copiar datos de una tabla a otra Rofocale Varios 1 18-05-2011 03:39:40
Ayuda insertar cadena en otra ? Coco_jac Varios 4 14-12-2005 21:37:46
necesito ayuda para pasar registros a otra tabla ddd_ddd Conexión con bases de datos 2 09-09-2005 20:33:41
ayuda para enlazar con otra tabla Debian Conexión con bases de datos 1 24-03-2005 16:48:28
Como puedo tabajar de otra forma un DBGrid, Ayuda urgente danytorres Varios 7 18-07-2003 21:24:02


La franja horaria es GMT +2. Ahora son las 19:56:06.


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