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.