Forum: Object-Pascal / Delphi-Language
Delphi
by alzaimar,
18. Mär 2009
Satty67 und Himitsu: Die AnsiCompareStr / AnsiCompareText Funktionen sind ja unglaublich langsam. Ich habe mir erlaubt, dies etwas zu optimieren. Die Grundidee ist die, anhand der AnsiCompareXXX-Routinen eine 'SortOrder'-Tabelle für einzelne Zeichen zu erzeugen und die Strings Zeichen für Zeichen mit Hilfe dieser Tabelle zu vergleichen.
Dazu erstelle ich ein Array Of Char, mit A = c. Danach...
Forum: Object-Pascal / Delphi-Language
Delphi
by alzaimar,
18. Mär 2009
Das liegt daran, das beim AnsiCompareText der String #255#255 < 'YYY' ist. Die Skiplist benötigt eine Markierung für das Listenende. Diese Markierung muss einen Schlüssel enthalten, der größer als alle anderen ist. Er wird im Initialization-Abschnitt erzeugt. Du musst also nur die CompareKeys-Methode so ändern, das sie immer 1 liefert, wenn aKey1 = <EndeMarkierung> ist.
Dann wird das Teil...
Forum: Object-Pascal / Delphi-Language
Delphi
by alzaimar,
17. Mär 2009
Satty67, in der letzten von mir geposteten Version ist eine angepasste SkipList, be der Du nur die virtuelle Methode 'CompareKeys' überschreiben musst, so etwa:
Type
TMySkipList = Class (TcsStringSkipList)
Protected
Function CompareKeys (Const aKey1, aKey2 : String) : ShortInt; Override;
End;
...
Function TMySkiplist.CompareKeys (Const aKey1, aKey2 : String) : ShortInt;
Begin
Forum: Object-Pascal / Delphi-Language
Delphi
by alzaimar,
17. Mär 2009
Ich darf doch nochmals daran erinnern, daß ihr bei großem 'Prefetch' eigentlich die gesamte Datei einlest und In-Memory sortiert, sodaß man auch gleich eine TStringlist mit 'Sort' verwenden könnte, oder irre ich mich?
Forum: Object-Pascal / Delphi-Language
Delphi
by alzaimar,
13. Mär 2009
Nach dem DRY-Prinzip ('Dont repeat yourself') solltest Du den Aufruf von GetStringLine so ändern, das die Zeilennummer (anstatt dem FileIndex) übergeben wird:
function GetStringLine(I : Integer; Upper : Boolean): string;
var
CharStr : PAnsiChar;
index : TIndex;
begin
index := FileIndex;
CharStr := StrAlloc(Index.size +1);
FillChar(CharStr^, Index.size +1, #0);
Forum: Object-Pascal / Delphi-Language
Delphi
by alzaimar,
12. Mär 2009
Ich habe das mal folgendermaßen gemacht:
1.Textdatei in ein temporäre Datei kopieren. Dabei alle Zeilen auf gleiche Länge bringen (mit #0 auffüllen). Hauptsache ich kann per Seek auf eine Zeile direkt zugreifen.
2.Quicksort auf die Textdatei loslassen. Bei Blöcken < 20000 habe ich die Zeilen eingelesen, in-Memory-Quicksort drübergebraten und den sortieren Block wieder abgespeichert.
3....