![]() |
Dublikat entfernen zu zeitintensiv
Moin,
Ich hab schon ne ganze Zeit net mehr in delphi geproggt, brauchte jetzt aber just mal ein kleines Programm. Ich habe eine Textdatei die ca 90 Mb groß ist. In jeder Zeile steht ein Wort, Zahl oder Einige sonderzeichen(kann auch alles vermischt sein) Nun wollte ich alle doppelten Einträhe entfernen. Dazu hab ich mir einfach mal aus einem meiner alten Delphiprojekte ein kleinen Codeschnipzel genommen.
Delphi-Quellcode:
Dies sollte eigentlich alle doppelten Einträge herausfiltern. Tut es auch wenn ich mit kleinen Dateien arbeite.
var sl: TStringlist;
begin sl:=TStringlist.Create; try SL.Sorted := true; SL.Duplicates := dupIgnore; SL.LoadFromFile('zusammen.txt'); Sl.SaveToFile('fertig.txt'); finally sl.Free; Nun mach ich es aber bei der 90 MB Datei und mein Pc (1,8 GHz) rennt schon seit ca 2 Stunden. Nun meine Frage(n): :arrow: Ist hier ein Fehler im Code? :arrow: Kann man dies Optimieren? :arrow: Mit welcher Methode sortiert eigenlich Delphi?(also bei diesem Beispiel) Schon mal im voraus vielen Dank MfG goodvirus |
Re: Dublikat entfernen zu zeitintensiv
Wieviel Speicher hat dein Rechner und wieviel Speicher braucht die Anwendung? Evtl. ist Windows nur am Swappen so das die eigentliche Bremse evtl. erst mal das Einlesen ist.
|
Re: Dublikat entfernen zu zeitintensiv
Delphi-Quellcode:
Versuchs mal so!
var sl: TStringlist;
begin sl:=TStringlist.Create; try SL.Sorted := true; SL.Duplicates := dupIgnore; SL.LoadFromFile('zusammen.txt'); SL.Sort; Sl.SaveToFile('fertig.txt'); finally sl.Free; |
Re: Dublikat entfernen zu zeitintensiv
Also ich hab 255 MB DDR-Ram 1,8 Ghz Pc. Hab sonst nix großes im hintergrung laufen.
Mein prog verbraucht laut Taskmanager ca 120 MB. @Moritz dein Code bringt keine veränderung, da sobald die liste eingelesen wird automatisch sortiert und nach dublikaten gegkuckt wird durch:
Delphi-Quellcode:
Und das zusätzliche:
SL.Sorted := true;
SL.Duplicates := dupIgnore;
Delphi-Quellcode:
bringt da eigentlich nix ^^
SL.Sort;
Ich habe jetzt nach einigem rumprobeiren, herausgefunden das das sortieren nur wenig Zeit in anspruch nimmt! Das Dublikate suchen an sich(wenn wer nicht weiß wie dies delphi macht schreib ich das gern) is der Hautanteil der Arbeit. MfG goodvirus Ps: Thx für die schnelle Hilfe hab jetzt erstmal abgebrochen bis ich ne Lösung gefunden hab |
Re: Dublikat entfernen zu zeitintensiv
Problem gelößt, auf ganz wundersame weise....
Ich habe eigentlich nichts groß am code geändert, aber auf einmal hats innerhalb 1 min geklapt!
Delphi-Quellcode:
MfG goodvirus Thx für die Hilfe
sl:=TStringlist.Create;
try sl.Sorted:=True; SL.Duplicates := dupIgnore; Application.ProcessMessages; SL.LoadFromFile('zusammen.txt'); Application.ProcessMessages; Sl.SaveToFile('fertig.txt'); Application.ProcessMessages; ShowMessage('Liste gespeichert'); finally sl.Free; |
Re: Dublikat entfernen zu zeitintensiv
Ich sag es ist trotzdem ein Speicherproblem.
Du sagst das Programm benötigt 120 MB - Welche Speicherangabe meist Du damit? Speicherauslastung oder Virtueller Speicher? Die implementierung von LoadFromFile ist nicht gerade optimal: Erst wird die Datei komplett in den Speicher geladen (90 MB) und anschließend die Stringlist aufgebaut (~ 90 MB) und anschließend gespeichert (90 MB). Und vermutlich kommt ohne Application.ProcessMessages Windows nicht dazu die ersten 90 MB wieder freizugeben. Und bei deinen damit mickrigen 256 MB (Windows braucht ja auch Speicher) wird Windows nur noch am Swappen sein. |
Re: Dublikat entfernen zu zeitintensiv
Wenn die Implementierung von LoadFromFile nicht so optimal ist, könnte man das ganze doch "von Hand" einlesen lassen, z.B. mit Hilfe eines Streams. Oder ist das auch nicht besser?
MfG Binärbaum |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:52 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 by Thomas Breitkreuz