Ich erforsche die Umstellung auf Python und Pandas als langjähriger SAS-Benutzer.
Als ich heute einige Tests durchführte, war ich überrascht, dass Python beim Versuch, pandas.read_csv()
eine 128-MB-CSV-Datei zu erstellen, nicht genügend Speicherplatz hatte . Es hatte ungefähr 200.000 Zeilen und 200 Spalten mit meist numerischen Daten.
Mit SAS kann ich eine CSV-Datei in ein SAS-Dataset importieren und sie kann so groß sein wie meine Festplatte.
Gibt es etwas Analoges pandas
?
Ich arbeite regelmäßig mit großen Dateien und habe keinen Zugriff auf ein verteiltes Computernetzwerk.
Antworten:
Im Prinzip sollte nicht der Arbeitsspeicher ausgehen, aber es gibt derzeit Speicherprobleme bei
read_csv
großen Dateien, die durch komplexe interne Python-Probleme verursacht werden (dies ist vage, aber seit langem bekannt: http://github.com/pydata / pandas / issue / 407 ).Im Moment gibt es keine perfekte Lösung (hier ist eine mühsame: Sie könnten die Datei zeilenweise in ein vorab zugewiesenes NumPy-Array oder eine speicherabgebildete Datei transkribieren -
np.mmap
), aber ich werde daran arbeiten in naher Zukunft. Eine andere Lösung besteht darin, die Datei in kleineren Teilen zu lesen (verwendeniterator=True, chunksize=1000
) und dann mit zu verkettenpd.concat
. Das Problem tritt auf, wenn Sie die gesamte Textdatei in einem großen Schluck in den Speicher ziehen.quelle
Wes hat natürlich recht! Ich mische mich nur ein, um einen etwas vollständigeren Beispielcode bereitzustellen. Ich hatte das gleiche Problem mit einer 129-MB-Datei, das behoben wurde durch:
quelle
df = concate(tp, ignore_index=True)
?AssertionError: first argument must be a list-like of pandas objects, you passed an object of type "TextFileReader"
. Irgendeine Idee, was hier passiert?pd.concat(list(tp), ignore_index=True)
Dies ist ein älterer Thread, aber ich wollte nur meine Problemumgehungslösung hier ablegen. Ich habe den
chunksize
Parameter anfangs ausprobiert (auch bei recht kleinen Werten wie 10000), aber es hat nicht viel geholfen. hatte immer noch technische Probleme mit der Speichergröße (meine CSV war ~ 7,5 GB).Im Moment lese ich nur Teile der CSV-Dateien in einem For-Loop-Ansatz und füge sie z. B. Schritt für Schritt einer SQLite-Datenbank hinzu:
quelle
pandas.read_csv
Gibt direkt (zumindest in der Version, die ich gerade verwende) einen Iterator zurück, wenn Sie einfachiterator=True
und angebenchunksize=chunksize
. Daher würden Sie einfach einefor
Schleife über denpd.read_csv
Anruf durchführen, anstatt ihn jedes Mal neu zu instanziieren. Dies kostet jedoch nur den Anrufaufwand, es gibt möglicherweise keine signifikanten Auswirkungen.iterator=True
undchunksize
Parameter existierten damals schon, wenn ich mich richtig erinnere. Vielleicht gab es einen Fehler in einer älteren Version, der die Speicherexplosion verursachte - ich werde es beim nächsten Lesen eines großen DataFrame in Pandas erneut versuchen (ich verwende Blaze jetzt hauptsächlich für solche Aufgaben)Unten ist mein Arbeitsablauf.
Basierend auf Ihrer Dateigröße sollten Sie die Blockgröße besser optimieren.
Nachdem Sie alle Daten in der Datenbank gespeichert haben, können Sie die benötigten Daten aus der Datenbank abfragen.
quelle
Wenn Sie große CSV-Dateien laden möchten, ist dask möglicherweise eine gute Option. Es ahmt die Pandas-API nach, fühlt sich also Pandas ziemlich ähnlich
Link zu Dask auf Github
quelle
Sie können Pytable anstelle von pandas df verwenden. Es ist für große Datenmengen ausgelegt und das Dateiformat ist in hdf5. Die Bearbeitungszeit ist also relativ schnell.
quelle