Ich habe eine Textdatei mit einem Wort in jeder Zeile, die Größe der Datei beträgt 800 GB. Ich muss die Wörter alphabetisch sortieren.
Ich habe versucht, das Windows- Sortierprogramm zu verwenden mit:
sort.exe input.txt /o output.txt
Das gibt den Fehler: Nicht genügend Hauptspeicher, um die Sortierung abzuschließen.
Ich habe also 32 GB RAM , wenn ich versuche, 10 GB Arbeitsspeicher für die Sortierung anzugeben:
sort.exe input.txt /o output.txt /M 10000000
Ich bekomme:
Warnung: Die angegebene Speichergröße wird auf den verfügbaren Paging-Speicher reduziert.
Eingabedatensatz überschreitet maximale Länge. Geben Sie ein größeres Maximum an.
Welche Möglichkeiten habe ich?
Antworten:
Welche Möglichkeiten habe ich?
Probieren Sie das Freeware Command Line Sort Utility CMSort aus .
Es werden mehrere temporäre Dateien verwendet und am Ende zusammengeführt.
Ein Benutzer gibt an, eine Datei mit 130.000.000 Bytes sortiert zu haben.
Wenn Sie selbst Code optimieren möchten, gibt es auch die Option " Riesige Textdateien sortieren " - CodeProject - "Algorithmus zum Sortieren von Zeilen in Textdateien, deren Größe den verfügbaren Speicher überschreitet".
quelle
--parallel
Option, wenn Sie mehr als einen Core haben ...)?Eine andere Möglichkeit besteht darin, die Datei in eine Datenbank zu laden. EG MySQL und MySQL Workbench.
Datenbanken sind perfekte Kandidaten für die Arbeit mit großen Dateien
Wenn Ihre Eingabedatei nur Wörter enthält, die durch eine neue Zeile getrennt sind, sollte dies nicht zu schwierig sein.
Nachdem Sie die Datenbank und MySQL Workbench installiert haben, müssen Sie dies tun.
Erstellen Sie zuerst das Schema (dies setzt voraus, dass Wörter nicht länger als 255 Zeichen sind, obwohl Sie dies durch Erhöhen des Argumentwerts ändern können). Die erste Spalte "idwords" ist ein Primärschlüssel.
Zweitens importieren Sie die Daten: ZB Dies importiert alle Wörter in die Tabelle (dieser Schritt kann eine Weile dauern. Mein Rat wäre, zuerst einen Test mit einer kleinen Wortdatei durchzuführen, und wenn Sie sicher sind, dass das Format das gleiche ist wie der größere (kürzen Sie die Tabelle. IE Clear it out und laden Sie den vollständigen Datensatz).
Dieser Link kann dabei helfen, das richtige Format für das Laden zu finden. https://dev.mysql.com/doc/refman/5.7/de/load-data.html
EG Wenn Sie die erste Zeile überspringen müssen, gehen Sie folgendermaßen vor.
Speichern Sie schließlich die sortierte Datei. Dies kann auch abhängig von Ihrem PC eine Weile dauern.
Sie können die Daten auch nach Belieben durchsuchen. EG Dies gibt Ihnen die ersten 50 Wörter in aufsteigender Reihenfolge (ab dem 0. oder ersten Wort).
Viel Glück,
Pete
quelle
mywords
wird ewig dauern. TrotzdemLIMIT
wird es genauso lange dauern wie das Ganze, da MySQL jeden einzelnen Wert von durchlaufenmywords
und bestellen muss. Um dies zu beheben, müssen Sie nach Abschluss des Vorgangs die folgenden Schritte ausführenLOAD DATA
. Fügen Sie einen Index zu hinzumywords
. Jetzt können Sie nach dieser Spalte bestellen, ohne dass es ein Jahrtausend dauert. Und es ist besser, den Index nach dem Laden der Daten hinzuzufügen, als zu dem Zeitpunkt, als Sie die Tabelle erstellt haben (viel schnelleres Laden der Daten).sort
Es gibt viele Algorithmen zum Sortieren geordneter und nicht geordneter Dateien [ 1 ] .
Da all diese Algorithmen bereits implementiert sind, wählen Sie ein bereits getestetes Programm aus.
In coreutils (von Linux, aber auch für Windows verfügbar [ 2 ] ) gibt es den
sort
Befehl, der unter Multi-Core-Prozessoren parallel ausgeführt werden kann: Normalerweise reicht er aus.Wenn Ihre Datei so umfangreich ist , können Sie die Aufteilung (
split -l
) der Datei in einige Abschnitte unterstützen, möglicherweise mithilfe der parallelen Option (--parallel
), und die resultierenden geordneten Abschnitte mit der-m
Option sortieren ( Zusammenführungssortierung ).Eine der vielen Möglichkeiten, dies zu tun, wird hier erläutert (Datei teilen, einzelne Chunks bestellen, geordnete Chunks zusammenführen, temporäre Dateien löschen).
Anmerkungen:
(Beispielsweise ist eine Blasensortierung der schnellste Algorithmus für eine bereits bestellte Datei - genau N -, in anderen Fällen ist sie jedoch nicht effizient).
quelle
Um eine alternative Lösung für Peter H anzubieten, gibt es ein Programm q, das SQL-Befehle für Textdateien erlaubt. Der folgende Befehl würde dasselbe tun (von der Eingabeaufforderung in demselben Verzeichnis wie die Datei ausführen), ohne dass SQL Workbench installiert oder Tabellen erstellt werden müssen.
c1
ist die Abkürzung für Spalte 1.Sie können doppelte Wörter mit ausschließen
und senden Sie die Ausgabe an eine andere Datei
quelle
Wenn die Wörter in jeder Zeile aus einem begrenzten Wortschatz stammen (z. B. Englisch), können Sie die Liste mithilfe einer TreeMap und der Anzahl der Aufzeichnungen (wobei m die Anzahl der eindeutigen Werte ist) nach O (n + m log m) sortieren.
Andernfalls können Sie den Big-Sorter der Java-Bibliothek verwenden . Die Eingabe wird in sortierte Zwischendateien aufgeteilt und effizient zusammengeführt (gesamtes O (nlogn)). So sortieren Sie Ihre Datei:
Ich habe eine 1,7 GB-Datei (100 m Zeilen) mit zufällig generierten 16-Zeichen-Wörtern erstellt und wie oben in 142 Sekunden sortiert. Basierend auf der Berechnungskomplexität von O (n log n) der von mir verwendeten Methode schätze ich, dass 800 GB 16-Zeichen-Wörter enthalten würden Es dauert ungefähr 24 Stunden, um auf meinem i5 2.3GHz Laptop mit SSD Single-Thread zu sortieren.
quelle