MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Reduzieren Sie den Speicherverbrauch beim Laden von Giant-Pandas-Datenframes aus MongoDB

Was in einer CSV-Datei und was in einem Datenrahmen ist, sind zwei sehr unterschiedliche Dinge. Beispiel:9.9 und 9.99999999999999 in einer CSV-Datei nimmt in einem Datenrahmen dieselbe Menge Platz ein.

Allerdings nehmen Daten in einem Datenrahmen viel weniger Platz ein als Daten in einer Liste. Das Erstellen einer Liste ist speicherintensiv; und das Anhängen an einen Datenrahmen erfordert, dass Pandas einen neuen (größeren) Datenrahmen erstellen, alles kopieren und dann den ursprünglichen Datenrahmen der Garbage-Collection überlassen.

Sie würden es wahrscheinlich viel besser machen, wenn Sie einen Datenrahmen von 60000 Zeilen vorab zuordnen würden (oder wie viele Zeilen Sie insgesamt haben); zB:

data = pd.DataFrame(np.empty((60000,), dtype=[
    ('x', np.uint8),
    ('y', np.float64)
]))

und dann für jede Zeile eingefügte Daten für diese Zeile, ohne sich auf dataset zu verlassen Liste:

data.values[count,:] = rowdata_at_count

Dies ist nicht typsicher, aber ziemlich schnell (da keine Zuweisungen stattfinden), stellen Sie also sicher, dass rowdata_at_count ist eine Liste, deren Elemente Spaltentypen entsprechen.

BEARBEITEN

Ja, das Anhängen von 100 Zeilen ist meiner Meinung nach wie 100 Verkettungen einer Zeile (da bei jedem Anhängen die Tabelle neu zugewiesen und kopiert werden muss, genau wie bei Verkettung). Die Vorabzuweisung vermeidet sowohl das Anhängen als auch das Zusammenfügen:Die Tabellengröße ändert sich nicht, es muss keine Neuzuweisung und kein Kopieren durchgeführt werden.