Ich verwende Python, um einige große Dateien zu analysieren, und es treten Speicherprobleme auf. Daher habe ich sys.getsizeof () verwendet, um die Verwendung zu verfolgen, aber das Verhalten bei numpy Arrays ist bizarr. Hier ist ein Beispiel mit einer Karte von Albedos, die ich öffnen muss:
>>> import numpy as np
>>> import struct
>>> from sys import getsizeof
>>> f = open('Albedo_map.assoc', 'rb')
>>> getsizeof(f)
144
>>> albedo = struct.unpack('%df' % (7200*3600), f.read(7200*3600*4))
>>> getsizeof(albedo)
207360056
>>> albedo = np.array(albedo).reshape(3600,7200)
>>> getsizeof(albedo)
80
Nun, die Daten sind immer noch da, aber die Größe des Objekts, eine Karte mit 3600 x 7200 Pixeln, ist von ~ 200 MB auf 80 Bytes gestiegen. Ich würde gerne hoffen, dass meine Speicherprobleme vorbei sind und einfach alles in numpy Arrays konvertieren, aber ich habe das Gefühl, dass dieses Verhalten, wenn es wahr ist, in irgendeiner Weise gegen ein Gesetz der Informationstheorie oder Thermodynamik oder so etwas verstoßen würde, also bin ich es geneigt zu glauben, dass getizeof () nicht mit numpy Arrays funktioniert. Irgendwelche Ideen?
sys.getsizeof
: "Geben Sie die Größe eines Objekts in Byte zurück. Das Objekt kann ein beliebiger Objekttyp sein. Alle integrierten Objekte geben korrekte Ergebnisse zurück, dies muss jedoch nicht für Erweiterungen von Drittanbietern gelten Implementierungsspezifisch. Es wird nur der direkt dem Objekt zugeordnete Speicherverbrauch berücksichtigt, nicht der Speicherverbrauch der Objekte, auf die es sich bezieht. "getsizeof
ein unzuverlässiger Indikator für den Speicherverbrauch, insbesondere für Erweiterungen von Drittanbietern.resize
zurückgegeben wirdview
, kein neues. Sie erhalten die Größe der Ansicht, nicht die tatsächlichen Daten.sys.getsizeof(albedo.base)
wird die Größe der Nichtansicht angegeben.Antworten:
Sie können
array.nbytes
für numpy Arrays verwenden, zum Beispiel:quelle
b.__sizeof__()
entsprichtsys.getsizeof(b)
round(getsizeof(a) / 1024 / 1024,2)
MBDas Feld nbytes gibt Ihnen die Größe aller Elemente des Arrays in Bytes in a
numpy.array
:Beachten Sie, dass dies keine "Nicht-Element-Attribute des Array-Objekts" misst, sodass die tatsächliche Größe in Bytes einige Bytes größer sein kann.
quelle
In Python-Notizbüchern möchte ich oft "baumelnde" herausfiltern
numpy.ndarray
, insbesondere diejenigen, die in gespeichert_1
sind._2
usw. , die am Leben zu bleiben nie wirklich gedacht waren.Ich benutze diesen Code, um eine Liste aller von ihnen und ihrer Größe zu erhalten.
Ich bin mir nicht sicher, ob
locals()
oder obglobals()
es hier besser ist.quelle