Beschleunigung der Lichtverarbeitung von ca. 50 GB CSV-Datei

8

Ich habe eine ~ 50GB csv-Datei mit der ich

habe
  • Nehmen Sie mehrere Teilmengen der CSV-Spalten
  • Wenden Sie für jede Teilmenge von Spalten der CSV eine andere Formatzeichenfolgenspezifikation an.
  • Geben Sie für jede Teilmenge eine neue CSV mit ihrer eigenen Formatspezifikation aus.

Ich habe mich für die Verwendung von Pandas entschieden und habe einen generellen Ansatz, um Chunks mit einer handlichen Chunk-Größe (von etwas mehr als einer halben Million Zeilen) zu durchlaufen, um einen Datenrahmen zu erzeugen und den Chunk an jede Ausgabe-CSV anzuhängen. So etwas wie das:

%Vor%

Mein Problem ist, dass das wirklich langsam ist. Jeder Chunk dauert ungefähr eine Minute, um die CSV-Dateien anhängen zu lassen, und ich schaue mir daher fast zwei Stunden Zeit für die Aufgabe an.

Ich habe versucht, einige Optimierungen vorzunehmen, indem ich nur die Vereinigung der Spaltenuntergruppen beim Einlesen in die CSV-Datei verwendet und na_filter=False gesetzt habe, aber das ist immer noch nicht akzeptabel.

Ich frage mich, ob es einen schnelleren Weg gibt, um diese leichte Verarbeitung einer CSV-Datei in Python zu machen, entweder durch eine Optimierung oder Korrektur meines Ansatzes oder vielleicht gibt es einfach ein besseres Werkzeug für diese Art von Job Pandas ... für mich ( ein unerfahrener Pandas Benutzer ) sieht das so aus, als wäre es so schnell, wie es mit Pandas möglich ist, aber ich kann mich sehr wohl irren.

    
Eric Hansen 25.07.2016, 08:25
quelle

3 Antworten

6

Ich glaube nicht, dass Sie einen Vorteil aus dem Datenrahmen eines Pandas ziehen, also fügen Sie einfach Overhead hinzu. Stattdessen können Sie Pythons eigenes CSV-Modul verwenden, das einfach zu verwenden und in C optimal zu optimieren ist.

Sie sollten viel größere Blöcke in den Speicher einlesen (vielleicht 10 MB gleichzeitig), und dann jedes der neu formatierten Spaltenuntergruppen aufschreiben, bevor Sie zum nächsten Block übergehen. Auf diese Weise wird die Eingabedatei nur einmal gelesen und geparst.

Ein anderer Ansatz, den Sie versuchen könnten, ist die Vorverarbeitung der Daten mit dem Unix cut Befehl, um nur die relevanten Spalten zu extrahieren (damit Python keine Objekte erstellen und Speicher für Daten in den nicht verwendeten Spalten reservieren muss): cut -d, -f1,3,5 somedata.csv

Versuchen Sie schließlich, den Code unter PyPy auszuführen, damit der CPU-gebundene Teil Ihres Skripts durch den Tracing-JIT optimiert wird.

    
Raymond Hettinger 29.08.2016, 19:42
quelle
0

Ich würde versuchen, das Python-CSV-Modul und Generatoren zu verwenden.

Ich habe Generatoren viel schneller als andere Ansätze zum Parsen von riesigen Server-Logs und so gefunden.

%Vor%

Dies ist nur zum Lesen einer Umwandlung einer einzelnen Eingabe csv in eine einzige Ausgabe csv, aber Sie könnten den Formatierer und Schreiber schreiben, um mehrere Dateien auszugeben.

(Ich sehe jetzt, dass diese Frage ein Monat alt ist - nicht sicher, ob Sie Ihr Problem bereits gelöst haben - wenn nicht und wenn Sie detailliertere Erklärungen / Beispiele wünschen, lassen Sie es mich wissen.)

    
JB Chouinard 29.08.2016 21:40
quelle
0

CPU ist schneller als der Festplattenzugriff. Ein Trick besteht darin, die Datei zu entpacken und daraus zu lesen.

%Vor%     
joel3000 29.08.2016 21:54
quelle

Tags und Links