Einzelnen Beitrag anzeigen

Satty67

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

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

  Alt 12. Mär 2009, 23:06
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 doch die bessere Variante. Wobei man die Dateizugriffe minimieren kann, indem man dem Index einen Teil der Zeile spendiert:
Delphi-Quellcode:
TIndexEntry = record
  offset,
  size : Integer; // size könnte man auch lassen, wenn man immer auf Zeilenseperator prüft
  part : array[0..2] of Char // Bsp. die ersten 3 Zeichen als Muster
end;
1) Man liest den Haupt-Index ein, muss also einmal die ganze Datei durcharbeiten.
2) Sortiert den Haupt-Index Anhand des Teilstring "part"
3) Arbeitet den fertig sortierten Haupt-Index chronologisch ab
- Index(n) <> Index(n+1) dann Zeile gleich in Zieldatei schreiben
- Index(n) = Index(n+1) dann ganze Quell-Zeile in einer neuen Teil-Liste zum nachsortieren puffern, solange bis wieder Index(n) <> Index(n+1). Dann sortiert man diese Teilliste und speichert sie in der Zieldatei.

Den Teilstring "part" müsste man dann anpassen, das es ausgewogen ist zw. Größe Haupt-Index und zu erwartende Teilisten. Je ähnlicher alle Zeilen, desto schlechter wird die Methode. Vorteil wäre halt, das die Datei nur zweimal komplett gelesen wird. Sortieren direkt in der Datei würde etwa die 20fache Menge bedeuten.

Evtl. könnte man sogar für beide Indexlisten TStringList verwenden, wenn man den Offset im Objekt speichert und auf size verzichtet.
  Mit Zitat antworten Zitat