Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Speicher Problem (https://www.delphipraxis.net/29707-speicher-problem.html)

Pseudemys Nelsoni 13. Sep 2004 15:40


Speicher Problem
 
Liste der Anhänge anzeigen (Anzahl: 1)
hi,

irgendwie wird ziemlich viel Speicher verbraucht wenn ich meine prozedur (kommt gleich) auf meinem programm ausführe...

siehe Anhang.



was kann ich dagegen tun?

Ich Überschreibe das OnPaint ereignis meiner Form und so sieht die Prozedur aus:

Delphi-Quellcode:
procedure TForm2.Paint;
var
  sl: TStringList;
  txt: TextFile;
  s: string;
begin
  inherited;
  if fFirstPaint then
  begin
    fFirstPaint := false;
    sl := TStringList.Create;
    try
      AssignFile(txt, ExtractFilePath(Application.ExeName)+'test.txt');
      Reset(txt);
      while not EOF(txt) do
      begin
        ReadLn(txt, s);
        sl.Add(s);
        Caption := 'Geladene Zeilen...' + IntToStr(sl.Count);
        Application.ProcessMessages;
      end;
      Caption := IntToStr(sl.Count) + ' Zeilen geladen';
    finally
      sl.Free;
    end;
  end;
end;
ok die textdatei selbst ist 76MB gross...

aber wieso verbrauche ich dann 110MB speicher? gibt es da ne lösung irgendwie? was wäre passiert wenn jemand nur 32mb ram hätte?

Shaman 13. Sep 2004 15:46

Re: Speicher Problem
 
Hoi

Der höhere Speicherverbrauch kommt daher, dass eine StringList ja aus lauter Strings besteht, welche die Zeilen darstellen. Und somit kommt zu deinen 76 MB Daten noch für jede Zeile 8 Bytes hinzu (Längenangabe und Reference Counter). Je nachdem wieviele Zeilen Du hast, macht das etwas aus...

Gruss
Shaman

Pseudemys Nelsoni 13. Sep 2004 15:48

Re: Speicher Problem
 
hm, danke erstmal.

also kann ich nur jedem raten keine grossen textdateien einzufügen?

Shaman 13. Sep 2004 15:56

Re: Speicher Problem
 
Brauchst Du wirklich alles auf einmal und könntest die Datei nicht blockweise einlesen?

Pseudemys Nelsoni 13. Sep 2004 15:58

Re: Speicher Problem
 
jo, brauche alles...

das schlimme ist ja das ich damit noch arbeiten muss... also jede zeile prüfen ob irgendetwas darin vorkommt.

Shaman 13. Sep 2004 16:01

Re: Speicher Problem
 
Dann mach es ohne StringList und lade es in einen einfachen String... Ist halt nicht mehr so komfortabel, aber es soll einem ja auch nicht eintönig werden :zwinker:

Gruss
Shaman

Luckie 13. Sep 2004 16:06

Re: Speicher Problem
 
Zitat:

Zitat von Pseudemys Nelsoni
jo, brauche alles...

das schlimme ist ja das ich damit noch arbeiten muss... also jede zeile prüfen ob irgendetwas darin vorkommt.

Wie so brauchst du denn dann alles? lad die ersten 500 Zeilen, berabeite sie, dann lädst du die nächsten 500 Zeilen unsw.

tommie-lie 13. Sep 2004 16:08

Re: Speicher Problem
 
Ich weiß nichtmal, was das ganze überhaupt soll.
Beim ersten Zeichnen der Form liest du eine Datei in eine Stringlist ein und schmeißt diese Daten anschließend wieder weg. Zusätzlich zeigst du dem Benutzer schön an, wieviele Zeilen du bisher schon geladen hast, die du anschließend ins Nirvana schicken wirst.
Effektiv was tun tust du also nicht. Das tust du aber schon beim starten des Programmes, wenn die Form zum ersten Mal gezeichnet wird.
Wäre es nicht sinnvoller, sowas anzuzeigen, wenn du auch wirklich was mit den eignelesenen Daten machst? :gruebel:

Edit: Vergesst es, ich sollte mich nicht ablenken lassen und 10 Minuten brauchen, um 5 Zeilen zu schreiben...

Thebe 13. Sep 2004 16:59

Re: Speicher Problem
 
Ich würds so machen:

Delphi-Quellcode:
procedure TForm2.Paint;
var
  sl: TStringList;
  txt: TextFile;
  s: string;
begin
  inherited;
  if fFirstPaint then
  begin
    fFirstPaint := false;
    sl := TStringList.Create;
    try
      Caption := 'Datei wird eingeladen...';
      Application.ProcessMessages;
      sl.LoadFromFile(s);
      Caption := IntToStr(sl.Count) + ' Zeilen geladen';
    finally
      sl.Free;
    end;
  end;
end;
Dann sparst Du dir das lahme Einlesen von Zeile für Zeile aus der Datei, Du benutzt sowieso StringList, da kann man das auch gleich so machen. Wenn die gesamte Datei zur gleichen Zeit im Speicher sein muss haste keine andere Chance RAM zu sparen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz