-
Forum: Object-Pascal / Delphi-Language
Delphi
by Satty67,
27. Mai 2009
/self Quote, Sorry
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Satty67,
27. Mai 2009
Was ursprünglich sortiert werden sollte, wurde nie bekannt ;)
Aber getestet wurde es an einem Wörterbuch (Wort pro Textzeile, bis zu 1.000.000 Zeilen), das in unkonventionell sortierter oder unsortierter Form vorliegt. Später zur besseren Vergleichbarkeit dann himitsus/alzaimars zufällig generierte Textdatei.
Sortieren war nie das Problem... Aufgabe war: Arbeitsspeicher schonen und...
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Satty67,
18. Mär 2009
Ja, gerade das Ergebnis begutachtet, ist ja schon implementiert. Hatte schon TTextFileSorter aus der Unit genommen.
Also hier nochmal ein paar Werte:
.
SorterTestfile Sample.txt
FileIO/AnsiCompStr/FasterAnsiComStr FileIO/AnsiCompStr/FasterAnsiComStr
csFasterSkipList --- / --- / 1875 ms --- / --- / 4375...
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Satty67,
18. Mär 2009
Also hab jetzt erst mal schnell die neue Version von csSkipList (noch ohne AnsiCompareStr) getestet.
Liegt bei der schwierigsten Datei Sample.txt deutlich vorne mit 4.500 ms (gegenüber 8.100 bzw 11.200 ms). Speicher-Einstellung hat bei der relativ kleinen Datei kaum Auswirkung auf die Zeit, weshalb mit 60 MB viel Luft für deutlich größere Dateien ist.
Ich baue dann noch heute noch die...
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Satty67,
18. Mär 2009
@himitsu:
hab' gerade festgestellt, dass Dein Programm bei offenem FireFox Browser nur halb so schnell ist bei Prefetch > 0. Ist der Browser geschlossen, gibt es richtig Gas. Das kann ich beliebig wiederholen... Browser offen -> langsamer, Browser geschlossen -> schnell. Nur Prefetch= 0 zeigt nahezu gleiche Werte :gruebel:
Die anderen Programme sind nicht derart beeinflusst...
Die...
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Satty67,
18. Mär 2009
Ok, die neuen Werte mit hitsumi's und meiner optimierten Version:
SorterTestFile himitsu(1) himitsu(1b) alzaimar(3) satty(4) Satty(4b) TList.Sort(5)
==============
Prefetch=0 24781 ms 18640 ms 1735 ms 24968 ms 21656 ms 2515 ms
Prefetch=4 17937 ms 13969 ms 1706 ms 18791 ms 15435 ms
Prefetch=8 17171 ms 13813 ms 1757 ms 17328 ms...
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Satty67,
18. Mär 2009
Also gestern hatte ich erst wie blöd optimiert, dann 3 Stunden gesucht, wo ich bei der Optimierung einen Fehler reingebaut hab' ;)
Bäumchen dachte ich auch, nur braucht ein Node ja auch 2 Pointer (Parent/Childlist) oder? Wenn dann 1 Zeichen nicht reicht, sind es wieder >9 Byte pro Zeile. Evtl. kann man auf Parent verzichten, der Baum wird ja immer von oben abgetastet?
Wollte auch mit Array...
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Satty67,
17. Mär 2009
Ja, das hin und her und die vieln Beispiel verwirren... auch die ganzen Units mit gleichen Namen hätten mich fast meinen Code gekostet ;)
Werde morgen mal aktualisieren... jetzt bin ich zu Müde, da mache ich nur wieder was falsches. Aber der Int64 vs. Word Fehler bei der Stopuhr hat mich gleich eine Klasse basteln lassen (ich soll ja üben):
unit UStopUhr;
interface
type
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Satty67,
17. Mär 2009
Ja StopUhr gehört Int64.
Die 138 MB Datei hat wohl nur sehr kurze/viele Zeilen? Das es aber schon bei 188 MB abbricht ist komisch, obwohl... der Taskmanager zeigt evtl. nicht allen Speicher an, den der MM reserviert.
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Satty67,
17. Mär 2009
Beides hatte ich schon geändert... SmallInt -> Integer hatte ich mich schon gefreut, aber bei wenn ich CompareText durch AnsiCompareText ersetze gibt es eine Zugriffsverletzung in INSERT.
Er weist q den Wert NIL (p^.ndfwd) zu, was bei der nächsten Abfrage q^.ndKey dann halt schief geht.
IgnoreDuplicates hab' ich geändert und die Werte oben angepasst.
PS: Das Wörterbuch hat keine...
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Satty67,
17. Mär 2009
Also wenn die Liste im Speicher ist und ich einfach Items via QuickSort sortiere bin ich 40% schneller gegenüber TList.Sort.
Will damit sagen, das TList nur dadurch so gute Werte hat, weil es ja einfach die Liste komplett einliest ohne auf den Speicher zu achten und dann wieder rausklatscht. Vorteil oben wird dadurch erkauft, dass Speicherbedarf bei 3,5x Dateigröße liegt.
Bei über 300 MB...
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Satty67,
17. Mär 2009
Gesehen, aber nichts bei gedacht ;) Lasse eine Testreihe laufen... melde mich gleich wieder.
***
So... also nachdem ich komische Ergebnisse hatte, hab' ich gleich mal eine Test-Datei erstellt:
500.000 Random-Lines A-Z (variable Länge 1-20 Zeichen), zusätzlich ubel, Ubel, übel & Übel um DIN-Sortierung zu testen. Die Datei ist in der Anlage (ausgepackt knapp 6 MB).
Zuvor hatte ich ja...
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Satty67,
17. Mär 2009
Ja fast... TStringList ist aber noch schlimmer. Verglichen mit der 8,5 MByte Datei (600.000 Zeilen), da braucht TStringList 29 MByte Speicher. Also das 3,5 fache... wie weit das skaliert, hab ich allerdings nicht getestet. Prefetch=1024 ist dann ja auch nur, um die Sortieralgorythmen zu testen... bei kurzen Zeilen ist aber auch Prefetch=0 nicht sehr effizient (auf den Overhead hast mich ja...
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Satty67,
16. Mär 2009
Ich hab' bei mir jetzt auch AnsiCompareStr (gleich schnell wie AnsiCompareText) eingebaut. Das hätte ich gleich machen sollen, so sortiert es richtig.
Dadurch konnte ich AnsiUpperCase beim Zeilen Laden entfernen:
Prefetch=0 : 37062 ms
Prefetch=1024 : 6536 ms
Also macht das beim Speicher-Sortieren sehr viel aus. Braucht doppelt solange, aber immer noch fix ;) Reines Datei-Sortieren ist...
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Satty67,
16. Mär 2009
Dauert noch etwas... die ganze Familie kontrolliert z.Z. noch mit... sind bei Zeile 498.385.
Scherz beiseite... sortiert PERFEKT!
Ubel > ubel > Übel > übel und Z am Ende, nicht die Umlaute
Sowieso nicht... veruche selber mich langsam daran zu gewöhnen AnsiString statt String zu schreiben. Ist bei D5 noch egal, aber eben wegen der geplanten Umstellung.
Aber denke das genau die...
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Satty67,
16. Mär 2009
Hab' paralell selber gesucht und scheint das casten auf LARGE_INTEGER des Wertes aus einem Record zu sein.
Folgendes hat gereicht:
offset := FileIndex.Offset; // offset lokal als Int64 declariert
If (SetFilePointer(SourceFile, i64.LowPart, @i64.HighPart, FILE_BEGIN) <> i64.LowPart)
or (i64.HighPart <> LARGE_INTEGER(Offset).HighPart) Then Exit;
Ok und gleich die Werte mit meinem...
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Satty67,
16. Mär 2009
Freut mich, das es als Basis gedient hat. Die Routinen würde ich wegen der Vergleichbarkeit gerne mal über meine Testdatei jagen, aber unter D5 meckert er:
" UFileQuickSort2.pas(58 ): Interner Fehler: C3517
Diese Fehlermeldung sollten Sie niemals erhalten - sie bedeutet, daß ein Programmierungsfehler im Compiler vorliegt." :gruebel:
himitsu vs. D5 Compiler = 1:0 :mrgreen:
Der...
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Satty67,
16. Mär 2009
In dem Thread gibt es auch fertigen Code und Klassen zum Problem.
alzaimar hat eine SkipList angepasst und in eine Klasse gesteckt. Das Teil ist höllisch schnell bei wenig Speicherverbrauch. Die derzeit beste Lösung, die ich gesehen hab' um große Dateien elegant zu sortieren.
PS: 600.000 Zeilen / 8,5 MByte in weniger als 3 Sekunden. (Speicherbedarf kann frei gewählt werden)
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Satty67,
13. Mär 2009
Aha... für sowas muss man aber ein Auge haben. :thumb:
Also in dem Fall: Anstatt mehrmals beim Procedure-Aufruf FileIndex schreiben zu müssen, nur "I" schreiben und die Zuweisung innerhalb der Procedure.
Ich geb' mir ja schon Mühe, den Quelltext sauber und strukturiert zu halten. Für solche Dinge, die mir Schreibarbeit sparen, müsste ich wohl mal ein spezialisiertes Buch lesen. Hab' da...
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Satty67,
13. Mär 2009
Der Code von himitsu hat mich erst verwirrt...
i := 0;
While not EoF(InFile) do Begin
ReadLn(InFile, S);
Inc(i);
End;
SetLength(List, i);
Er zählt erst nur die Zeilen um danach nochmal die Datei komplett zu lesen...
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Satty67,
13. Mär 2009
Auf jeden Fall hab' ich wieder ettliche Synapsen in meinem Gehirn angeregt... und der Threadstarter hat jetzt viel Material zum umsetzen.
Deine Version hab' ich mir natürlich auch gleich kopiert. Mal sehen, ob ich am Wochenende da QuickSort einbaue.
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Satty67,
13. Mär 2009
Das war klar... himitsu wieder schneller, hat sogar den Index mit VorschauString umgesetzt ;)
Ich hatte schon eine erste Version in Arbeit, die noch ohne Vorschau-String (part, TestStart etc.) arbeitet und wollte die danach optimieren. Den Code wegschmeißen will ich jetzt auch nicht, auch wenn er noch Fehler enthalten könnte:
procedure FileQuickSort(SourceFileName, TargetFileName: String);...
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Satty67,
13. Mär 2009
Ja, wenn die Zeilen nur so lang wie der "part" sind, liest Du sogar die ganze Datei in den Speicher.
Entweder eine Methode, die auf der Festplatte sortiert, dann reicht ein einfacher Index (notfalls auch auf der Festplatte angelegt). Aber dann musst Du jeden String zum Vergleichen neu auslesen. So wie ich das sehe, ist beim besten Sortierverfahren immer noch Faktor 16 beim Element Zugriff...
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Satty67,
12. Mär 2009
Also ich glaube er wollte nur sagen, dass sort.exe so garnicht nach unix klingt.
"Geifernder Hass" lese ich in dem Thread nur in einem Post :roll:
-
Forum: Object-Pascal / Delphi-Language
Delphi
by Satty67,
12. Mär 2009
Die Blöcke müsste natürlich größer sein, aber Du hast recht... da die Records (Zeilen) eine variable Größe haben, wird das ziemlich aufwändig. Zwar kann man innerhalb eines Blockes problemlos sortieren, weil die Gesamt-Blockgröße gleich bleibt, aber sobald zwischen Blöcken ausgetauscht werden muss wird es kompliziert.
Die Idee mit dem angelegten Index (ein paar Post vorher) finde ich da dann...