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 21-11-2022
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.744
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Veo que en medio del cálculo y escritura al fichero vas rellenando un TStringGrid (form1.stringgrid7).
recorres 8784 ficheros
1 Agregas 4 filas con con las 4 primeras columnas rellenadas con datos que lees.
2 Agregas tantas columnas como filas tenga el fichero
3 Escribes la tercera línea insertada al fichero de texto.

Esto genera un StringGrid enorme (8784 lineas x Tantas columnas como el fichero más grande leido(3600)).
8.784 x 3.600 = 31.622.400 celdas
Parece que todos contienen número convertidos a texto (aparentemente de 4 dígitos de máximo.)
Sin contar datos para la estructura (punteros, RTTI, y otros datos de control de StringGrid) tienes en memoria 126.489.600 bytes

Si no me he equivocado en las cuentas tienes 126 MB de memoria ocupada por el StringGrid.

Dado que no creo que estés mostrando el progreso en pantalla mediante el StringGrid, supongo que lo mas sensato es no utilizarlo y hacer algo mucho mas simple
He comentado el codigo a reemplazar, pero he dejado la parte donde rellenas las primeras 4 columnas del StringGrid con datos del fichero importado.
8.784 x 4 x 4bytes = 140.544 bytes (140 KB)

Código Delphi [-]
procedure lector;
var
  i, j : integer;
  milista : TStringList;
  // listafinal : TStringList;
  s, aux : string;
  F : TextFile;
  FileName : string;
begin
  // listafinal := TStringList.Create;
  // Abro el fichero destino
  FileName :=   dirE + 'final.txt';
  AssignFile(F, FileName);
  try
    // Si existe lo reescribo
    Rewrite(F);
    
    milista := TStringList.Create;
    try
      for i  :=  0 to form1.CheckListBox1.Count-1 do begin
        Application.ProcessMessages;
        
        if form1.CheckListBox1.Checked[i] then begin
          milista.LoadFromFile(form1.CheckListBox1.Items[i]);
          
          form1.stringgrid7.Cells[0, i+3] := inttostr(i+1);
          s := ExtractFileName(form1.checklistbox1.items.Strings[i]); 
          form1.stringgrid7.Cells[1, i+3] := copy(s, 0, 4);
          form1.stringgrid7.Cells[2, i+3] := inttostr(Juliana(copy(s, 0, 13)));
          form1.stringgrid7.Cells[3, i+3] := copy(s, 14, 4);
          form1.stringgrid7.rowCount := i+4;
          
          {
          for j := 4 to milista.Count-3 do begin
            if i=0 then begin // pongo los encabezados de tabla
              form1.stringgrid7.colCount := j+1;
              form1.stringgrid7.Cells[j, 0] := inttostr(j-3-numX*trunc((j-4)/numX));
              form1.stringgrid7.Cells[j, 1] := inttostr( trunc((j-4)/numY)+1 );
              form1.stringgrid7.Cells[j, 2] := inttostr(j-3);
            end;
            
            form1.stringgrid7.Cells[j, i+3] := copy(milista.Strings[j+2], 28, 10);
          end;

          form1.stringgrid7.Rows[i+3].Delimiter := ' ';
          // listafinal.Add(form1.stringgrid7.Rows[i+3].DelimitedText);          
          // Escribo la linea en el fichero destino
          WriteLn(F, form1.stringgrid7.Rows[i+3].DelimitedText);
          }
          // Primer registro
          j := 4;
          aux := copy(milista.Strings[j+2], 28, 10);
          // Siguientes registros separados por ' '
          for j := 5 to milista.Count-3 do begin
            aux := aux + ' ' + copy(milista.Strings[j+2], 28, 10);
          end;
          // Escribo los valores separados por espacios
          WriteLn(F, aux);
        end;
        
        milista.Clear;
      end;
    finally
      milista.Free;
    end;

    // listafinal.SaveToFile(dirE+'final.txt');
    // Cierro fichero destino    
    CloseFile(F);
  except
    on e: Exception do
      ShowMessage('Error al crear fichero : ' + FileName + #13#10 + e.Message);
  end;
  
  // listafinal.Free;
end;
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
Out of Memory javicho_villa Varios 12 04-10-2019 23:54:49
Out Of Memory Cesargt Varios 10 21-10-2015 20:53:51
Out of memory Firewind Lazarus, FreePascal, Kylix, etc. 3 20-07-2010 12:33:32
Out of Memory luxus OOP 5 30-09-2008 23:11:54
Dudas usando la clase TStringList blamsa Varios 6 27-05-2005 16:50:48


La franja horaria es GMT +2. Ahora son las 07:32:57.


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