sortiert große Textdaten

8

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.

    
fodon 16.08.2011, 14:08
quelle

4 Antworten

16

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:

%Vor%

Sortiert input.txt in seinem vierten Feld und gibt das Ergebnis in sorted.txt

aus     
urschrei 16.08.2011, 14:20
quelle
7

Sie möchten einen In-Memory-Index für die Datei erstellen:

  1. Erstellen Sie eine leere Liste
  2. open die Datei
  3. lies Zeile für Zeile (mit 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() )
  4. abgerufen werden
  5. close die Datei
  6. 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%     
gurney alex 16.08.2011 14:23
quelle
3

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.

    
QuentinUK 16.08.2011 14:34
quelle
1

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.

    
deStrangis 16.08.2011 14:21
quelle

Tags und Links