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?
getsizeof
ein unzuverlässiger Indikator für den Speicherverbrauch, insbesondere für Erweiterungen von Drittanbietern.
resize
zurückgegeben wird view
, 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.
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. "