Ich versuche gerade, eine Datei mit Pandas und Python für maschinelles Lernen zu öffnen. Es wäre ideal, wenn ich sie alle in einem DataFrame hätte. Jetzt ist die Datei 18 GB groß und mein RAM ist 32 GB, aber ich bekomme immer wieder Speicherfehler.
Aus Ihrer Erfahrung ist es möglich? Wenn nicht, kennen Sie einen besseren Weg, um dies zu umgehen? (Hive-Tabelle - vergrößern Sie meinen RAM auf 64 - erstellen Sie eine Datenbank und greifen Sie über Python darauf zu)
pandas
ist, dass Sie 5-10 mal mehr RAM benötigen. Ich empfehle,inplace
Operationengarbage.collector
auszuführen und Objekte explizit aufzurufen, um die Zuordnung aufzuheben.Antworten:
Wenn es sich um eine CSV-Datei handelt und Sie beim Trainieren Ihres Algorithmus nicht auf alle Daten gleichzeitig zugreifen müssen, können Sie diese in Blöcken lesen. Mit dieser
pandas.read_csv
Methode können Sie eine Datei wie folgt in Blöcken lesen:Hier ist die Dokumentation der Methode
quelle
Es gibt zwei Möglichkeiten: Entweder Sie müssen alle Ihre Daten im Speicher haben , für die Verarbeitung (zB Ihrer Maschine Lernalgorithmus möchte auf einmal alles konsumieren), oder Sie können , ohne es tun (zB Ihr Algorithmus benötigt nur Proben von Zeilen oder Spalten auf einmal).
Im ersten Fall müssen Sie ein Speicherproblem lösen . Erhöhen Sie die Speichergröße, mieten Sie einen Cloud-Computer mit hohem Speicherplatz, verwenden Sie Inplace-Vorgänge, geben Sie Informationen über die Art der Daten an, die Sie einlesen, löschen Sie alle nicht verwendeten Variablen und sammeln Sie Müll usw.
Es ist sehr wahrscheinlich, dass 32 GB RAM nicht ausreichen, damit Pandas Ihre Daten verarbeiten kann. Beachten Sie, dass die Ganzzahl "1" nur ein Byte ist, wenn sie als Text gespeichert wird, aber 8 Byte, wenn sie als dargestellt wird
int64
(dies ist die Standardeinstellung, wenn Pandas sie aus dem Text einliest). Sie können dasselbe Beispiel mit einer Gleitkommazahl "1.0" erstellen, diefloat64
standardmäßig von einer 3-Byte-Zeichenfolge zu einer 8-Byte-Zeichenfolge erweitert wird. Sie können Platz gewinnen, indem Sie Pandas genau mitteilen, welche Typen für jede Spalte verwendet werden sollen, und die kleinstmöglichen Darstellungen erzwingen. Wir haben jedoch nicht einmal angefangen, hier über den Datenstruktur-Overhead von Python zu sprechen, der hier oder da leicht einen oder zwei zusätzliche Zeiger hinzufügen kann und Zeiger sind jeweils 8 Byte auf einem 64-Bit-Computer.Zusammenfassend: Nein, 32 GB RAM reichen Pandas wahrscheinlich nicht aus, um eine 20 GB große Datei zu verarbeiten.
Im zweiten Fall (der realistischer ist und wahrscheinlich auf Sie zutrifft) müssen Sie ein Datenverwaltungsproblem lösen . In der Tat kann es ein Zeichen für eine schlechte Datenverwaltung sein, alle Daten laden zu müssen, wenn Sie wirklich nur Teile für die Verarbeitung benötigen. Hier gibt es mehrere Möglichkeiten:
Verwenden Sie eine SQL-Datenbank. Wenn Sie können, ist es fast immer die erste Wahl und eine anständige komfortable Lösung. 20 GB klingt wie die Größe, mit der die meisten SQL-Datenbanken gut umgehen würden, ohne dass sie selbst auf einem (High-End-) Laptop verteilt werden müssten. Sie werden in der Lage sein, Spalten zu indizieren, grundlegende Aggregationen über SQL durchzuführen und die erforderlichen Unterproben für eine komplexere Verarbeitung in Pandas mit einem einfachen Befehl abzurufen
pd.read_sql
. Durch das Verschieben der Daten in eine Datenbank können Sie auch über die tatsächlichen Datentypen und -größen Ihrer Spalten nachdenken .Wenn Ihre Daten überwiegend numerisch sind (z. B. Arrays oder Tensoren), können Sie sie in einem HDF5-Format speichern (siehe PyTables ), damit Sie bequem nur die erforderlichen Segmente großer Arrays von der Festplatte lesen können. Mit den grundlegenden Funktionen numpy.save und numpy.load wird der gleiche Effekt erzielt, indem die Arrays auch auf der Festplatte gespeichert werden. Für GIS und verwandte Rasterdaten gibt es dedizierte Datenbanken , die möglicherweise nicht so direkt wie SQL eine Verbindung zu Pandas herstellen, aber Sie sollten auch Slices und Abfragen relativ bequem ausführen können.
Pandas unterstützt meines Wissens keine solchen "partiellen" Speicherzuordnungen von HDF5- oder Numpy-Arrays. Wenn Sie dennoch eine Art "reine Pandas" -Lösung wünschen, können Sie versuchen, dies durch "Sharding" zu umgehen: Speichern Sie entweder die Spalten Ihrer riesigen Tabelle separat (z. B. in separaten Dateien oder in separaten "Tabellen" eines einzelnen HDF5 Datei) und laden Sie nur die erforderlichen nach Bedarf oder speichern Sie die Zeilenblöcke separat. Sie müssten dann jedoch die Logik zum Laden der erforderlichen Blöcke implementieren und so die in den meisten SQL-Datenbanken bereits implementierten Fahrräder neu erfinden. Daher wäre Option 1 hier möglicherweise noch einfacher. Wenn Ihre Daten jedoch in einer CSV-Datei vorliegen, können Sie sie in Blöcken verarbeiten, indem Sie den
chunksize
Parameter auf angebenpd.read_csv
.quelle
Ich hatte gerade dieses Problem vor ein paar Tagen! Ich bin mir nicht sicher, ob dies in Ihrem speziellen Fall hilfreich ist, da Sie nicht so viele Details angeben. Meine Situation bestand jedoch darin, an einem 'großen' Datensatz offline zu arbeiten. Die Daten wurden als CSV-Dateien mit 20 GB Gzip von Energiezählern erhalten, Zeitreihendaten in Intervallen von mehreren Sekunden.
Datei IO:
Erstellen Sie einen Chunk-Iterator direkt über der gzip-Datei (nicht entpacken!)
Iteriere über die Stücke
Innerhalb der Chunk-Schleife mache ich pünktlich einige Filter- und Neuabtastungen. Auf diese Weise habe ich die Größe von 20 GB auf einige hundert MB HDF5 für die weitere Offline-Datenexploration reduziert.
quelle
Nach meiner Erfahrung hilft das Initialisieren
read_csv()
mit Parameternlow_memory=False
beim Einlesen großer Dateien. Ich glaube nicht, dass Sie den Dateityp erwähnt haben, in dem Sie lesen, daher bin ich mir nicht sicher, wie dies auf Ihre Situation zutrifft.quelle
Wenn es sich bei Ihrer Datei um eine CSV handelt, können Sie dies einfach in Chunk by Chunk tun. Sie können einfach tun:
quelle