Ich möchte eine umfassendere Antwort geben, die auf den meisten potenziellen Lösungen basiert, die bereits bereitgestellt werden. Ich möchte auch auf eine weitere mögliche Hilfe hinweisen, die den Lesevorgang unterstützen kann.
Option 1: dtypes
"dtypes" ist ein ziemlich leistungsfähiger Parameter, mit dem Sie den Speicherdruck von read
Methoden reduzieren können. Siehe diese und diese Antwort. Pandas versuchen standardmäßig, d-Typen der Daten abzuleiten.
Bezugnehmend auf Datenstrukturen findet für alle gespeicherten Daten eine Speicherzuordnung statt. Grundsätzlich beziehen Sie sich auf die folgenden Werte (Die folgende Tabelle zeigt Werte für die Programmiersprache C):
The maximum value of UNSIGNED CHAR = 255
The minimum value of SHORT INT = -32768
The maximum value of SHORT INT = 32767
The minimum value of INT = -2147483648
The maximum value of INT = 2147483647
The minimum value of CHAR = -128
The maximum value of CHAR = 127
The minimum value of LONG = -9223372036854775808
The maximum value of LONG = 9223372036854775807
Auf dieser Seite finden Sie die Übereinstimmung zwischen den Typen NumPy und C.
Angenommen, Sie haben eine Reihe von Ganzzahlen mit Ziffern . Sie können sowohl theoretisch als auch praktisch ein Array vom Typ 16-Bit-Ganzzahl zuweisen, aber Sie würden dann mehr Speicher zuweisen, als Sie tatsächlich zum Speichern dieses Arrays benötigen. Um dies zu verhindern, können Sie die dtype
Option aktivieren read_csv
. Sie möchten die Array-Elemente nicht als lange Ganzzahl speichern, wo Sie sie tatsächlich mit einer 8-Bit-Ganzzahl ( np.int8
oder np.uint8
) versehen können.
Beachten Sie die folgende dtype-Karte.
Quelle: https://pbpython.com/pandas_dtypes.html
Sie können dtype
Parameter als Parameter für Pandas-Methoden übergeben, read
wie dies unter {column: type} vorgeschrieben ist.
import numpy as np
import pandas as pd
df_dtype = {
"column_1": int,
"column_2": str,
"column_3": np.int16,
"column_4": np.uint8,
...
"column_n": np.float32
}
df = pd.read_csv('path/to/file', dtype=df_dtype)
Option 2: Von Chunks gelesen
Durch das Lesen der Daten in Blöcken können Sie auf einen Teil der Daten im Speicher zugreifen, und Sie können eine Vorverarbeitung auf Ihre Daten anwenden und die verarbeiteten Daten anstelle von Rohdaten beibehalten. Es wäre viel besser, wenn Sie diese Option mit der ersten Option, dtypes , kombinieren würden .
Ich möchte auf die Pandas-Kochbuchabschnitte für diesen Prozess hinweisen, die Sie hier finden . Beachten Sie diese beiden Abschnitte dort;
Option 3: Dask
Dask ist ein Framework, das auf der Dask-Website wie folgt definiert ist :
Dask bietet erweiterte Parallelität für die Analyse und ermöglicht eine skalierbare Leistung für die Tools, die Sie lieben
Es wurde geboren, um die notwendigen Teile abzudecken, die Pandas nicht erreichen können. Dask ist ein leistungsstarkes Framework, mit dem Sie viel mehr auf Daten zugreifen können, indem Sie es auf verteilte Weise verarbeiten.
Sie können dask verwenden, um Ihre Daten als Ganzes vorzuverarbeiten. Dask kümmert sich um den Chunking-Teil. Im Gegensatz zu Pandas können Sie also einfach Ihre Verarbeitungsschritte definieren und Dask die Arbeit erledigen lassen. Dask wendet die Berechnungen nicht an, bevor sie explizit von compute
und / oder gepusht werden persist
(siehe die Antwort hier für den Unterschied).
Andere Hilfsmittel (Ideen)
- ETL-Fluss für die Daten ausgelegt. Behalten Sie nur das bei, was aus den Rohdaten benötigt wird.
- Wenden Sie zunächst ETL auf ganze Daten mit Frameworks wie Dask oder PySpark an und exportieren Sie die verarbeiteten Daten.
- Überprüfen Sie dann, ob die verarbeiteten Daten in den gesamten Speicher passen.
- Erwägen Sie, Ihren RAM zu erhöhen.
- Arbeiten Sie mit diesen Daten auf einer Cloud-Plattform.