Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-06-2015
Anel Hernandez Anel Hernandez is offline
Miembro
 
Registrado: mar 2005
Posts: 94
Poder: 20
Anel Hernandez Va por buen camino
hola,

de que tamaño desean el fichero? cuantas lineas?

gracias
Anel
Responder Con Cita
  #2  
Antiguo 30-06-2015
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
Anel Hernandez,

Cita:
Empezado por Anel Hernandez
...¿De que tamaño desean el fichero?, ¿Cuantas líneas?...


Te comento:

1- En principio sería suficiente un archivo con las primeras 100 líneas, la idea es poder crear uno con una estructura similar a efectos de prueba.

2- ¿Cual es el mayor y menor tamaño registrado para un archivo meteorológico?, ¿Cual es el tamaño promedio?.

3- Si como se indica en el Msg #3 trabajas con archivos de texto con tamaños en el orden de los GB y decenas de miles de registros, es conveniente analizar formas alternas de manejo de la data, por ejemplo por medio de una BD, ¿Podrías explicar un poco el proceso de generación, carga y procesamiento de la información meteorológica en cuestión?.

En resumen : No es conveniente manejar tal cantidad de datos en memoria, el problema no son los TStringList es el volumen de la data.

Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 01-07-2015 a las 07:43:26.
Responder Con Cita
  #3  
Antiguo 01-07-2015
Anel Hernandez Anel Hernandez is offline
Miembro
 
Registrado: mar 2005
Posts: 94
Poder: 20
Anel Hernandez Va por buen camino
hola,

normalmente los modelos de pronostico meteorologicos trabajan con ficheros .nc (netcdf). estos pueden llegar a tener varios GB.

hay otros modelos que se alimentan de estos ficheros, modelos de diagnostico meteorologicos, de dispersion atmosferica, fotoquimicos, etc.

algunos de ellos tienen herramientas para transformar los ficheros .nc en binarios o de texto. yo estoy trabajando con uno que los usa de texto.

son modelos establecidos hace decadas y lo que hago es aplicarlos. no tendria mucho sentido transformar en BBDD. la alternativa que he elegido es intentar optimizar los procesos de conversion etc.

ahora un ejemplo simple:
en mi caso tengo 66 ficheros de 1.46MB con 31882 lineas cada uno. Debo entonces copiar de los ficheros del 2 al 66, desde la linea 1257 de cada uno hasta la ultima (la 31882) y añadirselos al final del 1ro.

Al final tendria un fichero de 101MB y 2 022 507 lineas. ese es un ejemplo simple. pueden ser mas grandes.
Adjunto un fichero editado de ejemplo donde suprimo algunas lineas.

He intentado con el metodo del BeginUpdate y gana pocos segundos. adjunto imagenes.

En mi caso leo con:

Código Delphi [-]
SL1.LoadFromFile(fichero1);
For I:=2 to 66 do
 SL2.LoadFromFile(fichero[i]);
end;

y salvo al final en el mismo fichero1

Código Delphi [-]
SL1.SaveToFile(fichero1);

Gracias
Anel
Imágenes Adjuntas
Tipo de Archivo: jpg z_con.jpg (26,2 KB, 9 visitas)
Tipo de Archivo: jpg Copia z_sin.jpg (35,4 KB, 4 visitas)
Archivos Adjuntos
Tipo de Archivo: rar WRF01.rar (3,9 KB, 5 visitas)
Responder Con Cita
  #4  
Antiguo 01-07-2015
Avatar de Héctor Randolph
[Héctor Randolph] Héctor Randolph is offline
Miembro Premium
 
Registrado: dic 2004
Posts: 882
Poder: 20
Héctor Randolph Va por buen camino
Hola Anel Hernandez

Adicionalmente al uso de BeginUpdate-EndUpdate, también es recomendable fijar la propiedad Sorted a False.

Por otra parte, cuando agregas elementos a una lista dentro de un ciclo, la lista tendrá que ajustar dinámicamente el tamaño de la memoria reservada conforme se requiera. Sin darnos cuenta, esta operación puede repetirse un número considerable de veces y eso afectará el rendimiento.

Por este motivo, es muy aconsejable que puedas determinar con anticipación el número de elementos que vas a añadir y esto se puede indicar en la propiedad Capacity.

De esta forma reservamos la memoria en una sola operación antes de entrar al ciclo.

Código Delphi [-]
var
  ItemsToAdd: Integer;
  I: Integer;
begin
   ItemsToAdd:=100000; 
   .
   .
   .
   SL.Sorted:=False;
   SL.Capacity := SL.Count + ItemsToAdd;
   for I := 1 to ItemsToAdd do
    SL.Add('Algo');

Saludos
Responder Con Cita
  #5  
Antiguo 01-07-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 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.

Tomando en cuenta del formato del archivo que enviaste, proba de este modo:
Código Delphi [-]
procedure AddLinesToFile(const pFrom, pTo: Integer; const fSource, fTarget: string);
const
  CRLF = #$D#$A;
var
  fs: TStream;
  ts: TStrings;
  s : string;
  i : Integer;
begin
  fs := TFileStream.Create(fTarget, fmOpenReadWrite);
  try
    SetString(s, nil, fs.Size);
    fs.Read(s[1], fs.Size);
    s := s + CRLF;
    ts := TstringList.Create;
    try
      ts.BeginUpdate;
      try
        ts.LoadFromFile(fSource);
      finally
        ts.EndUpdate;
      end;
      for i:= pFrom to pTo do s := s + ts[i] + CRLF;
    finally
      ts.Free;
    end;
  finally
    fs.Position:= 0;
    fs.Write(s[1], Length(s));
    fs.Free;
  end;
end;

Código de prueba:
Código Delphi [-]
procedure TForm1.btnAddClick(Sender: TObject);
const
  MILLION = 1000000;
var
  Hz, Start, Stop: Int64;
begin
  QueryPerformanceFrequency(Hz);
  QueryPerformanceCounter(Start);

  // Añade las líneas 1257-3188 desde WRF02.DAT hacia WRF01.DAT
  AddLinesToFile(1257, 31882, 'c:\tmp\WRF02.DAT', 'c:\tmp\WRF01.DAT');

  QueryPerformanceCounter(Stop);
  ShowMessage(Format('%d µs.',[(Stop-Start) * MILLION div Hz]));
end;
Creo que demora un tiempo muy aceptable,



Saludos

Edito: Lo olvidaba ... - Tamaño de WRF01.DAT: 1,55 MB y WRF02.DAT: 12,3 MB
__________________
Daniel Didriksen

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

Última edición por ecfisa fecha: 01-07-2015 a las 19:01:13.
Responder Con Cita
  #6  
Antiguo 01-07-2015
Anel Hernandez Anel Hernandez is offline
Miembro
 
Registrado: mar 2005
Posts: 94
Poder: 20
Anel Hernandez Va por buen camino
hola ecfisa,

el ejemplo de tiempo que pones es para 2 ficheros? yo tengo que adicionar 65!!!!

de todas maneras pruebo.

gracias
A
Responder Con Cita
  #7  
Antiguo 01-07-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 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.

El penúltimo parámetro del procedimiento recibe el nombre del archivo del cuál se extraerán las líneas a ser agregadas. Basta con que envíes los nombres de los archivos a ser tratados de forma secuencial en él (65 o los que gustes).

Las líneas extraídas de los N archivos serán añadidas al archivo correspondiente al parámetro fTarget.

Saludos
__________________
Daniel Didriksen

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

Última edición por ecfisa fecha: 01-07-2015 a las 20:01:36.
Responder Con Cita
  #8  
Antiguo 01-07-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.048
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Esto me recuerda a:
Cita:
Empezado por Ley de Brooks
"Una señora es capaz de tener un hijo en nueve meses, pero este plazo no puede disminuir por muchas mujeres embarazadas que pongamos a ello"
Responder Con Cita
Respuesta



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 02:05:08.


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