Ich habe also eine enorm große Datei (ca. 10 GB) und muss sie sortieren, genau wie bei der Verwendung des Dienstprogramms "Sortieren", aber irgendwie effektiver.
Das Problem ist, dass ich keinen Speicher, keine CPU-Leistung, keine Zeit und keinen freien Austauschplatz habe, um die gesamte Sorte mit Strom zu versorgen.
Das Gute ist, dass die Datei bereits teilweise geordnet ist (ich kann sagen, dass der Abstand jeder Zeile von ihrer endgültigen Position kleiner als ein Wert N ist). Diese Art erinnert mich an das klassische Beispiel der Computerklasse für die Verwendung von Heapsort mit Heap der Größe N für diesen Zweck.
Frage: Gibt es ein Unix-Tool, das dies bereits effektiv erledigt, oder muss ich selbst eines codieren?
Danke -mk
Sortieren, verwendet und R-Way-Merge-Sortieralgorithmus. Der schnellste Weg, um Ihre Arbeit zu erledigen, wäre:
Dies impliziert O (n logn) Zeitkomplexität und O (n) Zeit.
Wenn Sie die Daten partitionieren, werden Sie sie wahrscheinlich zeitlich bezahlen.
Der obige Code hat ein Problem. Mit sort -m wird nicht garantiert, dass die Dateien gegenseitig sortiert werden.
aus dem Unix-Handbuch:
z.B
file1: abcklq file2: dem
abcklqdem
das ist nicht in der Art.
Auch die Tatsache, dass sich die Elemente an Stellen befinden, die kleiner als N sind, garantiert keine sortierte Ausgabe mit dem obigen Code:
Datei: aebcdhfg
in der Datei N = 3 und alle Elemente sind weniger als 3 Stellen als ihre richtige Stelle
Datei1: hfg, Datei2: bcd, Datei3: ae
produziert:
Datei1: fgh, Datei2: bcd, Datei3: ae
und
Ausgänge:
aebcdfgh
was falsch ist.
quelle
sort file1
usw. wird nur die Ausgabe sortiert, nicht die reale Datei, da sort standardmäßig in stdout schreibt. Wenn Sie diessort -m
anschließend tun , wenden Sie einen Mergesort auf noch unsortierte Dateien an, was nicht funktioniert, da vorsortierte Dateien erwartet werden. Aber die Sortier-Manpage ist an dieser Stelle eindeutig falsch.