-
Forum: Neuen Beitrag zur Code-Library hinzufügen
Delphi
by Satty67,
15. Mär 2009
Ist sie, das macht schon Spass. Hatte noch versucht mit der QuickSort/InsertionSort Kombo zu punkten, konnte aber nur beim reinen Speicher-Sortieren nochmal 20% gut machen... wenn es über die Festplatte läuft, ist die SkipList Variante einfach nicht zu schlagen.
Also Ich hätte auch eine 300 MB Datei gleich via Speicher sortiert... aber denke 60 MB sollte jeder frei haben, sonst ist es besser...
-
Forum: Neuen Beitrag zur Code-Library hinzufügen
Delphi
by Satty67,
15. Mär 2009
Angewendet auf meine Wörterbuch (wegen der Vergleichbarkeit):
Mit Defaultwert aMemoryToUse=10.000.000 belegt es ~59 MB Arbeitsspeicher.
Mit aMemoryToUse=1.000.000 nur noch ~7 MB :thumb:
(Im Taskmanager sieht man das schlecht, weil es so fix ist)
Das Ding ist in der Version ganz schön schnell (~2200 ms)
Sortiert in der Version jetzt noch Binär, statt alphanumerisch (bei meiner...
-
Forum: Neuen Beitrag zur Code-Library hinzufügen
Delphi
by Satty67,
15. Mär 2009
Gut, also den Datentyp muss ich ändern. Angedacht war ja auch ein array of Char, was aber wieder aufwändiger als ein ShortString wäre. Das hat priorität, weil das ganze ja sonst kein Sinn macht.
TStringList verbrät übrigens mit 29 MB noch mehr Speicher, da wäre ich mit meinen 4 MB ja schon mit der jetzigen Version ganz gut im Rennen. Gleich schnell bin ich aber nur, wenn ich mir auch 23 MB...
-
Forum: Neuen Beitrag zur Code-Library hinzufügen
Delphi
by Satty67,
15. Mär 2009
Gut, der verwendete Datentyp für den Prefetch-String sollte geändert werden. Zwar relativiert sich das bei längeren Zeilen, aber die sind ja nicht garantiert.
Die 8,5 MByte große Testdatei (600.000 Zeilen) belegte bei mir mit Prefetch=0 ca. 4 Mbyte, bei Prefetch=1024 sind es 23 Mbyte. Da muss ich also dringend was ändern.
Gar nicht... im Initial-Thread hast Du ja auch Vorschläge gemacht,...
-
Forum: Neuen Beitrag zur Code-Library hinzufügen
Delphi
by Satty67,
15. Mär 2009
@alzaimar
Den zusätzlichen Funktionsaufruf bei Prefetch=0 ausklammern hat was gebracht, aber nur bei Prefetch=0;
PivotIdx := (LoIndex + HiIndex) div 2;
PivotFullText := LineFromFile(PivotIdx);
repeat
if FPrefetchSize = 0 then begin
while LineFromFile(LoIdx) < PivotFullText do Inc(LoIdx);
-
Forum: Neuen Beitrag zur Code-Library hinzufügen
Delphi
by Satty67,
15. Mär 2009
TStringList liest die Datei komplett ein und ist auch bei genug Speicher die richtige Variante.
Im Ausgangs-Thread (siehe Post#1) ging es um Textdateien ab 300 MB, die eben nicht komplett in den Speicher sollen.
Folgende ungünstige Ausgangs-Situation (ungünstig, da kurze Zeilen):
Wörterbuch mit Zeilen bis 20 Buchstaben Länge.
Prefetch ist auf 5
Dann wird nur ca 25% in den Speicher...
-
Forum: Neuen Beitrag zur Code-Library hinzufügen
Delphi
by Satty67,
15. Mär 2009
Hatte ich erst auch nicht verstanden, bei PrefetchSize = 0 sollte ja der Zeitaufwand gleich sein. Aber ist es nicht. Test-Datei und Sortier-Routine ist ja bis auf die andere Behandlung der Zeilen identisch.
da ich mich aber auch gleichzeitig noch mit der Klasse an sich beschäftigt hatte, ist da möglicherweise noch ein Fehler drin:
{<--- Holt eine Textzeile aus der Quell-Datei --->}...
-
Forum: Neuen Beitrag zur Code-Library hinzufügen
Delphi
by Satty67,
15. Mär 2009
So also hier mal mein Versuch, das in eine Klasse zu packen:
Interface Teil:
uses SysUtils, Classes;
resourcestring
txt_SourceFileError = 'Quell-Datei kann nicht geöffnet werden!';
txt_TargetFileError = 'Ziel-Datei kann nicht geöffnet werden!';
-
Forum: Neuen Beitrag zur Code-Library hinzufügen
Delphi
by Satty67,
15. Mär 2009
@alzaimar
Leider hat der Vorschlag, das Nachsortieren zu vermeiden, nicht den erhofften Erfolg gebracht. Der zusätzliche Vergleich und Funktionsaufruf kostet mehr Zeit. Das frisst den Vorteil bei allen Prefetch-Werten auf!
mit Nachsortieren vs. ohne Nachsortieren
PrefetchSize = 0 : 40.500 ms vs. 53450 ms
PrefetchSize = 4 : 17.400 ms vs. 21730 ms
PrefetchSize = 8 : 8.460 ms vs. 11390 ms...
-
Forum: Neuen Beitrag zur Code-Library hinzufügen
Delphi
by Satty67,
15. Mär 2009
Zum Glück bin ich kein IT-Schüler oder Berufs-Programmierer, kann mir also die Aufgaben aussuchen bzw. auch auslassen. Ich kann mich in dem Bereich also nur selbst fordern :wink:
Nachdem ich nun etwas weiter bin, aber noch lange nicht fertig, bin ich am Zweifeln.
Mal ganz abgesehen von Anfängerfehlern im Ausgangscode (Cancle-Variante) und Code-Logik. Abgesehen von der fehlenden...
-
Forum: Neuen Beitrag zur Code-Library hinzufügen
Delphi
by Satty67,
14. Mär 2009
Ok, dann hab' ich mich 15 Jahre erfolgreich davor gedrückt. :lol: Gab es auch schon in meinem TuboPascal 6.0. Aber richtig wichtig wurde (meinem Gefühl nach) erst in Delphi.
@alzaimar:
Danke für die Klassen-Deklaration, darauf kann ich aufbauen.
-
Forum: Neuen Beitrag zur Code-Library hinzufügen
Delphi
by Satty67,
14. Mär 2009
Den Smiley's fehlt eines, das wie ein gerupftes Hühnchen aussieht. :wink:
Das ganze in eine Klasse zu packen, das dauert bei mir dann aber etwas länger. Die ganzen Mechanismen sitzen bei mir noch nicht (ohne OH). Werde es aber wohl dann als Übung nehmen, das ganze besser zu verstehen.
Danke für die konstruktive Kritik. Perfekten Code, mit all den neuen Möglichkeiten von Delphi, werde ich...
-
Forum: Neuen Beitrag zur Code-Library hinzufügen
Delphi
by Satty67,
14. Mär 2009
Top Vorschlag, löst dann auch mein Problem mit dem u.U. langsameren Speichern. Da hatte ich einen Denkfehler beim Entwurf, aber es wird ja so auch nicht mehr Speicher belastet und die Dateizugriffe bleiben gleich.
Abbruch im Callback ist jetzt klar und leicht umzusetzen.
Über die Grenzen bin ich mir nicht 100% klar. bei einer Datei unter 2 GByte kann es auch zu Problemen kommen?
(die...
-
Forum: Neuen Beitrag zur Code-Library hinzufügen
Delphi
by Satty67,
14. Mär 2009
Ja, die Pseudo-Konstanten nehme ich auch immer dann, wenn einer Variablen sowieso im Code ein Defaultwert zugewiesen wird. Ist mehr eine Hilfe für mich, das gleich im Interface zu sehen.
Aber ich probiere aus, wie ich es mit einer rein lokalen Variable via Callback-Funktion hin bekomme. Klingt für mich auch eleganter, bin halt nur nicht auf die Idee gekommen :stupid:
-
Forum: Neuen Beitrag zur Code-Library hinzufügen
Delphi
by Satty67,
14. Mär 2009
http://www.delphipraxis.net/internal_redirect.php?t=153933
In diesem Thread gab es die Frage, wie man am Besten sehr große Textdateien sortieren könnte, ohne den Arbeits-Speicher zu sehr zu belasten. Im Thread wurde die Methode entwickelt und erste kleine Code-Beispiele gepostet. Für kleinere Dateien ist wohl TStringList eleganter, aber eben auch nicht immer geeignet.
Hier ist nun meine...