Ich benutze NumPy, um einige große Datenmatrizen (von etwa ~ 50 GB Größe) zu behandeln. Die Maschine, auf der ich diesen Code ausführe, hat 128 GB RAM, so dass einfache lineare Operationen dieser Größenordnung kein Speicherproblem darstellen sollten.Speicherwachstum mit Broadcast-Operationen in NumPy
Allerdings bin ich Zeuge eines großen Speicherwachstum (mehr als 100 GB), wenn Sie den folgenden Code in Python Berechnung:
import numpy as np
# memory allocations (everything works fine)
a = np.zeros((1192953, 192, 32), dtype='f8')
b = np.zeros((1192953, 192), dtype='f8')
c = np.zeros((192, 32), dtype='f8')
a[:] = b[:, :, np.newaxis] - c[np.newaxis, :, :] # memory explodes here
Bitte beachten Sie, dass die anfängliche Speicherzuordnungen erfolgt ohne Probleme. Wenn ich jedoch versuche, den Subtraktionsvorgang mit dem Senden auszuführen, wird der Speicher auf mehr als 100 GB erhöht. Ich dachte immer, dass Broadcasting zusätzliche Speicherzuweisungen vermeiden würde, aber jetzt bin ich mir nicht sicher, ob das immer der Fall ist.
Kann also jemand etwas darüber sagen, warum dieses Speicherwachstum stattfindet und wie der folgende Code mit mehr speichereffizienten Konstrukten umgeschrieben werden könnte?
Ich führe den Code in Python 2.7 in IPython Notebook.
'c' ist * erstellt * mit Form (1, 192, 32), also warum indexieren Sie es als' c [np.newaxis,:,:]] '? Dies erzeugt eine Ansicht mit Form (1, 1, 192, 32). –
Danke für's Bemerken - es war ein Tippfehler, als ich den Code passte hier in SO – Cesar