Ver Mensaje Individual
  #16  
Antiguo 30-10-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Reputación: 36
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 Anel Hernandez

Como te menciona Agustín cuando los archivos son muy grandes es mas adecuado usar los procedimientos estandar de entrada/salida.
El método LoadFromFile de la clase TStrings, carga la totalidad del archivo en la memoria y luego lo divide en líneas, haciendo que se duplique el consumo de memoria y a veces puede provocar fragmentaciónes en la misma.

A cada variable de archivo de texto, Delphi le asigna un almacenamiento interno (buffer) de 128 bytes, por lo que usar el procedimiento SetTextBuff para modificar este valor, va a acelerar un poco el proceso.

Reproduje la situación con cuatro archivos de 228 Mb en este ejemplo:
Código Delphi [-]
...

procedure AppendTextFiles(const TargetName: TFileName;
  const SourceNames: array of TFileName);
var
  i      : Integer;
  source,
  target : TextFile;
  buffer : array[1..4096] of Char; 
  row    : string;
begin
  AssignFile(target, TargetName);
  // (*)
  try
    Reset(target);
  except
    ReWrite(target);
  end;
  // 
  Append(target);
  System.SetTextBuf(target, buffer);

  for i := Low(SourceNames) to High(SourceNames) do
  begin
    AssignFile(source, SourceNames[i]);
    Reset(source);
    System.SetTextBuf(source, buffer);
    while not Eof(source) do
    begin
      Readln(source, row);
      Writeln(target, row);
    end;
    Close(source);
  end;

  CloseFile(target);
end;


procedure TForm1.btnWritelnClick(Sender: TObject);
const
  MILLON = 1000000;
var
  Hz, Start, Stop: Int64;
begin
  QueryPerformanceFrequency(Hz);
  QueryPerformanceCounter(Start);

  AppendTextFiles('total.txt',['p1.txt', 'p2.txt', 'p3.txt', 'p4.txt']);
  QueryPerformanceCounter(Stop);

  ShowMessage(Format('%d µs.',[(Stop-Start) * MILLON div Hz]));
end;
Con un resultado en mi equipo de 76558319 µs ~ 76,55 s, tiempo mas que razonable.



(*): Si deseas que siempre se sobreescriba el archivo destino, reemplaza las lineas entre comentarios por:
Código Delphi [-]
ReWrite(target);

Saludos
__________________
Daniel Didriksen

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

Última edición por ecfisa fecha: 30-10-2015 a las 22:18:43. Razón: sintáxis
Responder Con Cita