![]() |
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:
ok die textdatei selbst ist 76MB gross...
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; 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? |
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 |
Re: Speicher Problem
hm, danke erstmal.
also kann ich nur jedem raten keine grossen textdateien einzufügen? |
Re: Speicher Problem
Brauchst Du wirklich alles auf einmal und könntest die Datei nicht blockweise einlesen?
|
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. |
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 |
Re: Speicher Problem
Zitat:
|
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... |
Re: Speicher Problem
Ich würds so machen:
Delphi-Quellcode:
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.
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; |
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