Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Coloboración Paypal con ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #8  
Antiguo 30-10-2015
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 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
 



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
Borrar una parte de un TStringList eennzzoo C++ Builder 2 28-06-2014 14:04:13
copiar el contenido de un TStringList a TSringGrid GerTorresM Varios 1 02-07-2010 18:38:41
copiar la parte seleccionada de un imagen fasthorse C++ Builder 4 14-05-2008 20:05:03
Copiar parte de la pantalla.... craven Gráficos 2 27-08-2003 22:53:01
Copiar Parte de un BMP a otro craven API de Windows 1 07-07-2003 10:45:34


La franja horaria es GMT +2. Ahora son las 18:03:32.


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