5 Stimmen

Numpy-Array-Speicherproblem

Ich glaube, ich habe ein Speicherproblem bei der Verwendung von Numpy-Arrays. Der folgende Code läuft stundenlang:

    new_data = npy.array([new_x, new_y1, new_y2, new_y3])
    private.data = npy.row_stack([private.data, new_data])

wo new_x, new_y1, new_y2, new_y3 Floats sind.

Nach ungefähr 5 Stunden Aufzeichnung dieser Daten alle Sekunde (mehr als 72000 Floats) wird das Programm nicht mehr reagiert. Ich glaube, dass eine Art von realloc- und Kopieroperation stattfindet, die den Prozess überlastet. Weiß jemand, ob das passiert?

Ich brauche eine Möglichkeit, diese Daten aufzuzeichnen, ohne auf dieses Verlangsamungsproblem zu stoßen. Es gibt keine Möglichkeit, die Größe dieses Arrays im Voraus zu kennen. Es muss nicht unbedingt ein Numpy-Array verwenden, aber es muss etwas Ähnliches sein. Kennt jemand eine gute Methode?

3voto

dwf Punkte 3345

Verwenden Sie Python-Listen. Ernsthaft, sie wachsen deutlich effizienter. Dafür sind sie konzipiert. Sie sind in dieser Umgebung bemerkenswert effizient.

Wenn Sie am Ende ein Array aus ihnen erstellen müssen (oder sogar gelegentlich mitten in dieser Berechnung), ist es viel effizienter, zuerst in einer Liste anzusammeln.

2voto

mtrw Punkte 31777

Aktualisierung: Ich habe @EOLs ausgezeichneten Vorschlag zur Indizierung in die Antwort integriert.

Das Problem könnte daran liegen, wie row_stack das Ziel wachsen lässt. Es wäre möglicherweise besser, die Neuzuweisung selbst zu handhaben. Der folgende Code allokiert ein großes leeres Array, füllt es und lässt es wachsen, während es jede Stunde füllt

numcols = 4
wachstumsgröße = 60*60 #60 Proben/Min * 60 Min/Stunde
numrows = 3*wachstumsgröße #3 Stunden, um anzufangen
private.data = npy.zeros([numrows, numcols]) #allokiere einen großen Speicherblock
rowctr = 0
während (aufzeichnung):
    private.data[rowctr] = npy.array([new_x, new_y1, new_y2, new_y3])
    rowctr += 1
    wenn (rowctr == numrows): #voll, wachse um die Daten einer weiteren Stunde
        private.data = npy.row_stack([private.data, npy.zeros([wachstumsgröße, numcols])])
        numrows += wachstumsgröße

Dies sollte verhindern, dass der Speicherverwalter zu stark agiert. Ich habe dies im Vergleich zu row_stack auf jeder Iteration versucht und es lief ein paar Größenordnungen schneller.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X