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:
Saludos