Forum: Neuen Beitrag zur Code-Library hinzufügen
Delphi
by alzaimar,
15. Mär 2009
Wat? Dat Teil is schneller? :gruebel: Lustic, aber diese Skiplistoptimierung ist wirklich nett.
Edit: Ich hänge mal eine verbesserte Version (mit doppelten Einträgen und überschreibbarer 'CompareKeys' Methode) an. Kannst ja mit rumspielen.
Noch eins: Findest Du 60MB Speicherverbratung schlimm? Du hast doch genug davon, also...
Forum: Neuen Beitrag zur Code-Library hinzufügen
Delphi
by alzaimar,
15. Mär 2009
Ich habe mal den Algorithmus im Wiki nachgebaut. Der Vorteil ist, das man den Speicherbedarf festlegen hat. Das Verfahren degeneriert also nicht und funktioniert auch bei beliebig großen Dateien, ist dafür aber langsamer. : Nö, sogar schneller.
Im Prinzip passiert Folgendes:
1. Eingabedatei wird in einzelne Abschnitte a <MaxSize> Bytes unterteilt:
1.1 Es werden solange Zeilen eingelesen,...
Forum: Neuen Beitrag zur Code-Library hinzufügen
Delphi
by alzaimar,
15. Mär 2009
:mrgreen: :wall: :cheers:
Ich würde:
1. Den Prefetch als String (x<=5) statisch deklarieren, somit entfällt ein Großteil des Overheads.
2. Einen Cache zwischenschalten (auch eine Prima Übung).
Der Cache merkt sich die N zuletzt gefetchten Zeilen. Bevor Du eine Zeile aus der Datei liest, fragst Du, ob sie schon im Cache vorhanden ist. Wenn ja, ist gut. Wenn nicht, liest Du sie aus der...
Forum: Neuen Beitrag zur Code-Library hinzufügen
Delphi
by alzaimar,
15. Mär 2009
Ich verstehe nicht, wieso das bei prefex=0 langsamer sein soll... Doch: Das Pivot-Element wird nicht gecached. Aber trotzdem müssen komplette Zeilen häufiger gelesen werden.
Dein Lösungsansatz widerspricht zudem deiner Eingangs gemachten Vorgabe ('Dateien mit wenig speicherlast sortieren'). Bei hohen Prefex-Größen liest du eh die ganze Datei (und mehr) in den Speicher. Versuche es mit der sehr...
Forum: Neuen Beitrag zur Code-Library hinzufügen
Delphi
by alzaimar,
14. Mär 2009
Satty67, kein Problem. Irgendwann hat Jeder mal angefangen. Poste deine Versuche hier rein, wenn du magst. Du siehst, das man hier gerne hilft. Vielleicht fängst Du mit der Schnittstelle deiner FileSorter-Klasse an. Vielleicht so:
Type
TTextFileSorterStatus = (tfsInitialiting, tfsSorting, tfsDone, tfsAbort);
TTextFileSortNotifyEvent = Procedure (Sender : TObject; aStatus :...
Forum: Neuen Beitrag zur Code-Library hinzufügen
Delphi
by alzaimar,
14. Mär 2009
Du kannst Dir das Nachsortieren komplett sparen, indem Du Die Vergleichsroutine mit einem optionalen Nachladen ausstattest, etwa so:
Function CompareTextlines (aIdx1, aIdx2 : TLineIndex) : Shortint; // -1: aIdx1<aIdx2, 0: beide gleich
Begin
Result := CompareString (aIdx1.prefetch, aIdx2.prefetch);
If Result = 0 Then // prefetch-Strings sind identisch, also nachladen, um sicher zu sein
...