Wenn der Speicher von Waggons und / oder einem kleinen Datensatz ohne Optimierung sicher in Pandas geworfen werden kann. Wenn die Daten jedoch groß sind, stellt sich die Frage, wie sie verarbeitet oder zumindest gezählt werden sollen.
Es wird vorgeschlagen, die Optimierung in Miniatur zu betrachten, um keine riesigen Datensätze aus dem Netzwerk zu ziehen.
Als Datensatz werden wir Habrastatistiken mit Benutzerkommentaren für 2019 verwenden, die dank eines fleißigen Benutzers öffentlich verfügbar sind:
DatensatzAls Informationsgrundlage wird der zuvor übersetzte
Artikel von Habr verwendet, in dem viele interessante Dinge gemischt sind.
Anstatt mitzumachen
Der Habrastatistik-Datensatz wird als klein angesehen, obwohl er 288 MB belegt und aus 448.533 Zeilen besteht.
Natürlich können Sie weitere Daten finden, aber um das Auto nicht aufzuhängen, lassen Sie uns darüber nachdenken.
Zur Vereinfachung der Operationen fügen wir die Spaltennamen hinzu (schreiben Sie einfach die erste Zeile in die Datei):
a,b,c,d
Wenn Sie nun den Datensatz direkt in Pandas laden und überprüfen, wie viel Speicher er verwendet
import os import time import pandas as pd import numpy as np gl = pd.read_csv('habr_2019_comments.csv',encoding='UTF') def mem_usage(pandas_obj): if isinstance(pandas_obj,pd.DataFrame): usage_b = pandas_obj.memory_usage(deep=True).sum() else:
sehen, dass er 436,1 MB "isst":
RangeIndex: 448533 entries, 0 to 448532 Data columns (total 4 columns): a 448533 non-null object b 448533 non-null object c 448533 non-null object d 448528 non-null object dtypes: object(4) memory usage: 436.1 MB
Es zeigt auch, dass es sich um Spalten handelt, die Daten vom Typ Objekt enthalten.
Daher ist es laut
Artikel für Spalten erforderlich, sich auf die für das Objekt berechnete Optimierung zu konzentrieren. Für alle Spalten außer einer.
Spalte b enthält Datumsangaben. Um weitere Berechnungen und Klarheit zu ermöglichen, ist es besser, sie an den Indexdatensatz zu senden. Ändern Sie dazu den Code, der beim Lesen des Datensatzes verwendet wird:
gl = pd.read_csv('habr_2019_comments.csv', parse_dates=['b'], encoding='UTF')
Jetzt werden die Daten als Index des Datensatzes gelesen und der Speicherverbrauch wird leicht reduziert:
memory usage: 407.0 MB
Jetzt optimieren wir die Daten im Dataset selbst außerhalb der Spalten und des Index
Die Optimierung heißt: "Optimierung der Speicherung von Daten von Objekttypen unter Verwendung kategorialer Variablen".
Wenn ins Russische übersetzt, müssen wir die Daten in den Spalten nach Kategorien kombinieren, wo sie wirksam sind.
Um die Effektivität zu bestimmen, müssen Sie die Anzahl der eindeutigen Werte in den Spalten kennen. Wenn sie weniger als 50% der Gesamtzahl der Werte in der Spalte beträgt, ist die Kombination der Werte in der Kategorie effektiv.
Schauen wir uns den Datensatz an:
gl_obj=gl.select_dtypes(include=['object']).copy() gl_obj.describe()
::
acd count 448533 448533 448528 unique 25100 185 447059 top VolCh 0 ! freq 3377 260438 184
* Spalte mit Datumsangaben im Index und nicht angezeigt
Wie Sie aus der eindeutigen Zeile in den Spalten
a und
c ersehen können , ist die Vereinigung in der Kategorie wirksam. Für Spalte a sind dies 25100 Benutzer (offensichtlich weniger als 448533), für c - 185 Werte der Skala mit "+" und "-" (ebenfalls deutlich weniger als 448533).
Wir optimieren die Spalten:
for col in gl_obj.columns: num_unique_values = len(gl_obj[col].unique()) num_total_values = len(gl_obj[col]) if num_unique_values / num_total_values < 0.5: converted_obj.loc[:,col] = gl_obj[col].astype('category') else: converted_obj.loc[:,col] = gl_obj[col]
Um zu verstehen, wie viel Speicher der Einfachheit halber verwendet wird, führen wir eine Funktion ein:
def mem_usage(pandas_obj): if isinstance(pandas_obj,pd.DataFrame): usage_b = pandas_obj.memory_usage(deep=True).sum() else:
Und prüfen Sie, ob die Optimierung effektiv war:
>>> print(' : '+mem_usage(gl_obj)) : 407.14 MB >>> print(' : '+mem_usage(converted_obj)) : 356.40 MB >>>
Wie Sie sehen können, wurde ein Gewinn von weiteren 50 MB empfangen.
Nachdem wir nun verstanden haben, dass die Optimierung davon profitiert hat (es passiert und umgekehrt), werden wir die Datensatzparameter beim Lesen festlegen, um die Daten, mit denen wir uns befassen, sofort zu berücksichtigen:
gl = pd.read_csv('habr_2019_comments.csv', parse_dates=['b'],index_col='b',dtype ={'c':'category','a':'category','d':'object'}, encoding='UTF')
Wir wünschen Ihnen eine schnelle Arbeit mit Datensätzen!
Der Code zum Herunterladen ist
hier .