Einzelnen Beitrag anzeigen

Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#42

Re: Große Datei sortieren ohne komplett in den Speicher zu l

  Alt 16. Mär 2009, 22:21
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 dabei minimal schneller geworden, warum auch immer.

..und die SkipList vergessen wir, das muss ein Objekt aus der Hölle sein. Das kann nicht menschlich sein

Ich baue dann noch QuickSort mit InsertSort ein, das bring beim Sortieren nochmal 20-25%. Folgenden Code hab ich mit einer Stringliste getestet und mit purem Quicksort verglichen:
Delphi-Quellcode:
{<<<< QuickInsertSort >>>>}
procedure TFormTestSorter.QuickInsertSort(L,R: Integer);
var
  I, J : integer;
  S, P : String;
begin
  // QuickSort für Elemente, die weiter auseinander liegen
  if (R - L) > 23 then begin

    i := l;
    j := r;
    p := StringList[(l+r) DIV 2];

    repeat
      while StringList[i] < p do i := i + 1;
      while StringList[j] > p do j := j - 1;

      if i <= j then begin
        if i < j then begin
          s := StringList[i];
          StringList[i] := StringList[j];
          StringList[j] := s;
        end;
        i := i + 1;
        j := j - 1;
      end;
    until i > j;

    if l < j then QuickInsertSort(l, j);
    if i < r then QuickInsertSort(i, r);

  // InsertionSort für Element-Entfernungen unter 24
  end else begin

    for I := L + 1 to R do begin
      if (StringList[I] < StringList[I - 1]) then
      begin
        S := StringList[I];
        J := I;
        while ((J > L) and (StringList[J - 1] > S)) do
        begin
          StringList[J] := StringList[J - 1];
          J := J - 1;
        end;
        StringList[J] := S;
      end;
    end;

  end;
end;
  Mit Zitat antworten Zitat