Einzelnen Beitrag anzeigen

nahpets
(Gast)

n/a Beiträge
 
#34

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

  Alt 16. Mär 2009, 10:12
Hallo,

am Wochenende habe ich mal versucht, ein Programm zu schreiben, das auch große Dateien sortieren kann, ohne dabei allzuviel Speicher zu belegen.

Das Programm ist schnell beschrieben:

Man wähle eine Eingabedatei und eine Ausgabedatei. Wähle die Anzahl der Zeilen aus, die in einem Durchgang sortiert werden sollen, wähle, ob Groß-/Kleinschreibung berücksichtigt werden soll, und starte die Sortierung.

Was passiert nun beim Sortieren?

Die Eingabedatei wird in Teile mit der angegebenen Zeilenzahl aufgeteilt, wobei jeder Teil sortiert wird. Ist die Eingabedatei nun aufgeteilt und die Teile sind sortiert, so werden anschließend die Teile zusammengeführt und dabei wird die Sortierung beachtet. Sofern mehr als 3 Teile erstellt werden, erfolgt die Zusammenführung für vier Teildateien gleichzeitig, andernfalls werden zwei Dateien zusammengeführt.

Die Zusammenführung erfolgt in der Form, dass bei jeder Zusammenführung ein neuer Teil erstellt wird. Dieser Vorgang wird solange wiederholt, bis nur noch ein Teil übrig ist. Die einzelnen Teile werden, sobald sie zusammengeführt wurden gelöscht, um Plattenplatz im Temporärverzeichnis zu sparen. Insgesamt wird hierdurch maximal der zweifache Plattenplatz der Eingabedatei benötigt.

Der Speicherverbrauch des Programmes ist abhängig von der Größe der einzelnen Teile. Je mehr Teile erstellt werden, um so länger ist die Laufzeit des Programmes (es sei denn, dass der Speicherverbrauch so hoch wird, dass Windows die Auslagerungsdatei benutzen muss, dann bricht die Laufzeit stark ein). Bei der Verwendung kleinerer Teile ist der Speicherverbrauch geringer. Allerdings steigt der Speicherverbrauch bei sehr großen Teilen stark an. Welche Größe der einzelnen Teile optimal ist, muss durch Versuch und Irrtum ermittelt werden.

Für die Speicherung der Teile wird das Temporärverzeichnis aus %TEMP% benutzt. Es muss daher sichergestellt sein, dass dort ausreichend Platz zu Verfügung steht. Das Programm prüft, ob der Speicherplatz voraussichtlich ausreicht.

Für die Sortierung wird eine Stringliste benutzt, die für die Sortierung AnsiCompareStr bzw. AnsiCompareText verwendet. Die Sortierung weicht daher von einer Sortierung mit einfachen Größer-/Kleinervergleichen ab.

Das Programm ist weder objektorientiert noch nach irgendwelchen ästhetischen Gesichtspunkten gestaltet, sondern einfach nur nach dem Motto: geht das?

Wer Änderungswünsche hat, realisiere sie bitte und stelle die Ergebnisse hier zur Verfügung
Code:
Laufzeittest mit einer Textdatei von 307.949.380 Byte mit fester Zeilenlänge von 326 Byte.

Rechner 1: Pentium 3 mit 750 MHz und 512 MB Speicher
getrennte Festplatten für Daten, temporäres Verzeichnis und Auslagerungsdatei (3 Festplatten)

Größe der Teile in Zeilen - Laufzeit - Speicherverbrauch - Dateigröße der Teile
     10.000                 00:09:09   ca. 10.720 kByte        3.260.000 Byte
     20.000                 00:08:20   ca. 15.384 kByte        6.520.000 Byte
     50.000                 00:06:48   ca. 35.324 kByte       16.300.000 Byte
    100.000                 00:06:23   ca. 69.708 kByte       32.600.000 Byte
    200.000                 00:06:22   ca. 134.132 kByte       65.200.000 Byte
  1.000.000                 00:36:47   ca. 416.000 kByte      307.949.380 Byte
-------------------------------------------------------------------------------

Rechner 2: Pentium 4 mit 2 GHz und 1024 MB Speicher
eine Festplatte für Daten, temporäres Verzeichnis und Auslagerungsdatei

Größe der Teile in Zeilen - Laufzeit - Speicherverbrauch - Dateigröße der Teile
     10.000                 00:08:57   ca. 13.376 kByte        3.260.000 Byte
     20.000                 00:08:38   ca. 19.000 kByte        6.520.000 Byte
     50.000                 00:07:20   ca. 38.820 kByte       16.300.000 Byte
    100.000                 00:06:35   ca. 71.828 kByte       32.600.000 Byte
    200.000                 00:07:37   ca. 137.780 kByte       65.200.000 Byte
  1.000.000                 00:20:38   ca. 539.144 kByte      307.949.380 Byte
-------------------------------------------------------------------------------
Was schließen wir hier nun aus den Ergebnissen dieser beiden Vergleiche?
Schneller Rechner und viel Speicher sind bei großen Dateien von Vorteil, wenn sie "am Stück" verglichen werden, andernfalls ist die Geschwindigkeit der Festplatten für die Laufzeit nicht unerheblich.

Der Rechner 1 hat deutlich schnellere Festplatten als Rechner 2. Beide Rechner sind nicht unbedingt die neuesten (Alter: Rechner 1: 9 Jahre, Rechner 2: 4 Jahre).

Geändert von nahpets (21. Nov 2017 um 16:41 Uhr)
  Mit Zitat antworten Zitat