Wer sich mit Data Analytics beschäftigt, hat hin und wieder mit sehr großen Dateien zu kämpfen. Diese entstehen schlichtweg heutzutage in vielen Wirtschaftszweigen. Ob Industrie 4.0 oder M2M Kommunikation, überall werden Zahlenkolonnen gespeichert und dann auch hoffentlich irgendwann ausgewertet.

Dabei überschlagen sich die Consultants im Jahrestakt mit neuen Buzzworts zum Thema. Vor einigen Jahren hieß es  noch ‚Cloud‘, aktuell wird über ‚Big Data‘ geschrieben und bald kann man von ‚Smart Data‘ lesen.

Dabei gilt:

Vielleicht liegt es ja daran, dass viele PowerPoint Profis nur Excel auf dem Laptop installiert haben und das ein oder andere mal die nachfolgende Meldung gelesen haben:

Reaktion von Excel auf eine 1GB .csv Datei

Reaktion von Excel auf eine 1GB .csv Datei

Die Reaktion von Excel, wenn man versucht eine 1GB große Daten-Datei in eine Arbeitsmappe zu laden. Ist aber noch kein Big Data Problem. Wer selbst probieren möchte:

Excel stößt mit dieser Datei schon an seine Grenzen. Enthalten sind beispielhafte Daten, wie sie z.B. von unserem CarPC gesendet werden.

UUID, Latitude, Longitude, Value

Und von diesen Datenzeilen eben sehr viele. Versuchen wir nun diese Datei zu öffnen, um damit Berechnungen auszuführen, zu filtern oder Diagramme zu erstellen.

Effizientes Einlesen von großen CSV Dateien mit Python

Mit Python hat man mehrere Möglichkeiten eine Textdatei einzulesen. Wir konzentrieren uns auf 3 typische Module:

  • das Python CSV Modul, welches der Standard ist
  • Python Pandas, welches alles vereinfacht
  • Python Blaze

Schauen wir mal. Alle nachfolgenden Zeitangaben sind natürlich vom System abhängig. Die Zeiten sind auf einem MacBook Pro, 2.5GHz Intel Core i5, 8GB 1600MHz DDR3-RAM, SSD Festplatte mit IPython in der Anaconda Distribution und nur 1x ermittelt.

datafile = 'somerandom1GBsampledata.csv'

Einlesen einer 1GB Datei mit Python CSV Modul

import csv
datacsv = []
with open(datafile, 'rb') as f:
 reader = csv.reader(f)
 for row in reader:
 datacsv.append(row)

Das Lesen der 1GB großen Datei dauert knapp 35s.

Einlesen einer 1GB Datei mit Python Pandas

import pandas as pd
datapandas = pd.read_csv(datafile)

Das Lesen der 1GB großen Datei dauert knapp 25s. Das ist schnell! Der Entwickler von Pandas, Wes McKinney schreibt

pandas.read_csv from pandas 0.5.0 onward is actually very fast– faster than R and much faster than numpy.loadtxt– but it uses a lot of memory.

Mehr Infos über Pandas read_csv…

Wenn der Arbeitsspeicher ausgelastet ist, lagert das Betriebssystem auf die Festplatte aus. Hat man eine SSD ist das noch vertretbar, allerdings ist die Größe von freiem Speicherplatz auf einer SSD auch limitiert. Gut wäre also, wenn man das Einlesen Memory Efficient erledigen könnte.

Einlesen einer 1GB Datei mit Python Blaze

from blaze import Data
datablaze = Data(datafile)

Das „Lesen“ der 1GB großen Datei dauert ca. 12ms, das sind 0.012s. Blazing fast!

Blaze ist dabei ein noch etwas unbekanntes Modul. Continuum Analytics schreibt zu Blaze:

Blaze is designed to handle out-of-core computations on large datasets that exceed the system memory capacity

Ein Überblick zu Blaze bietet dieser Talk von der PyData NYC.

Einlesen einer 1GB Datei mit Mathworks Matlab

Als Referenz, weil weit verbreitet, wurde die Datei auch mit Matlab R2013b eingelesen.

formatSpec = '%s%f%f%f%[^\n\r]';
datamatlab = textscan(datafile, formatSpec);

Es vergehen geschlagene 9 Minuten!

Timing Vergleich zwischen CSV, Pandas, Blaze und Matlab

Die Zeit, bis die Daten gelesen waren, ergaben sich wie folgt:

weniger ist besser

weniger ist besser

Mit anderen Dateigrößen ergeben sich im Vergleich folgende Timings (logarithmische Skalierung beachten):

How long does it take to load a CSV file with Python, Pandas, Blaze and Matlab?

Es fällt auf, dass es Blaze egal ist, wie groß die Datei ist. Mehr dazu…

Fazit

Selbst auf einem durchschnittlichen Laptop lassen sich Dateien mit 1GB und mehr ohne Probleme öffnen, einlesen und bearbeiten. Dabei empfiehlt sich folgendes Vorgehen:

  1. Continuum Analytics Distribution ‚Anaconda‘ installieren
  2. Pandas nutzen, (z.B. `read_csv`)
  3. Blaze

Auch mit 10GB großen Dateien lässt sich auf einem Notebook arbeiten. Der Mittelwert von reichlich 177mio Werten dieser Datei lässt sich mit Blaze ohne Herausforderungen für Arbeitsspeicher oder Festplatte berechnen.

blaze-mean

(Sequenz gekürzt! Die Mittelwertberechnung dauerte ca. 120s)

Download Testdata.csv.zip

Timings mit R, Ruby, JavaScript, Java, Matlab oder C?

Wir würden uns freuen ähnliche Timings mit anderen Setups zu sehen! Die Daten stehen zum Download zur Verfügung, nutzt die Kommentare.
Download Testdata.csv.zip