Ich habe eine große Datei (100 Millionen Zeilen von Tab-getrennten Werten - etwa 1,5 GB groß). Was ist der schnellste Weg, um dies basierend auf einem der Felder zu sortieren?
Ich habe Bienenstock probiert. Ich würde gerne sehen, ob dies mit Python schneller gemacht werden kann.
Haben Sie überlegt, das Programm * nix sort
zu verwenden? Im Grunde ist es wahrscheinlich schneller als die meisten Python-Skripte.
Geben Sie -t $'\t'
an, um anzugeben, dass es tabulatorgetrennt ist, -k n
, um das Feld anzugeben, n
ist die Feldnummer und -o outputfile
, wenn Sie das Ergebnis in eine neue Datei ausgeben möchten.
Beispiel:
Sortiert input.txt
in seinem vierten Feld und gibt das Ergebnis in sorted.txt
Sie möchten einen In-Memory-Index für die Datei erstellen:
open
die Datei f.readline()
, und speichere in der Liste ein Tupel, bestehend aus dem Wert, nach dem du sortieren willst (extrahiert mit line.split('\t').strip()
) und dem Offset der Zeile in der Datei (die du kann durch Aufruf von f.tell()
vor dem Aufruf von f.readline()
) close
die Datei sort
die Liste Um die sortierte Datei zu drucken, öffnen Sie die Datei erneut und verwenden Sie für jedes Element Ihrer Liste f.seek(offset)
, um den Dateizeiger an den Anfang der Zeile zu verschieben, f.readline()
, um die Zeile und print
die Zeile zu lesen .
Optimierung: Vielleicht möchten Sie die Länge der Zeile in der Liste speichern, damit Sie f.read(length)
in der Druckphase verwenden können.
Beispielcode (optimiert für die Lesbarkeit, nicht für die Geschwindigkeit):
%Vor%Aufteilen in Dateien, die im Speicher sortiert werden können. Sortiere jede Datei im Speicher. Dann füge die resultierenden Dateien zusammen.
Zusammenführen, indem Sie einen Teil jeder der zusammenzuführenden Dateien lesen. Dieselbe Menge von jeder Datei, die genug Speicherplatz im Speicher für das zusammengeführte Ergebnis übrig lässt. Einmal zusammengeführt und dabei gespeichert. Wiederholen Sie das Hinzufügen von Blöcken von zusammengeführten Daten in die Datei.
Dadurch wird der Datei-E / A minimiert und die Datei auf der Festplatte verschoben.
Ich würde die Datei in einer guten relationalen Datenbank speichern, sie auf dem Feld indizieren, an dem Sie interessiert sind, und dann die bestellten Artikel lesen.