Sto usando Python per analizzare alcuni file di grandi dimensioni e sto incontrando problemi di memoria, quindi sto usando sys.getsizeof () per cercare di tenere traccia dell'uso, ma il suo comportamento con array intorpiditi è bizzarro. Ecco un esempio che coinvolge una mappa di albedos che devo aprire:
>>> 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
Bene, i dati sono ancora lì, ma la dimensione dell'oggetto, una mappa di 3600x7200 pixel, è passata da ~ 200 Mb a 80 byte. Mi piacerebbe sperare che i miei problemi di memoria siano finiti e convertire tutto in array intorpiditi, ma sento che questo comportamento, se vero, violerebbe in qualche modo una legge della teoria dell'informazione o della termodinamica, o qualcosa del genere, quindi sono propenso a credere che getsizeof () non funziona con array intorpiditi. Qualche idea?
getsizeof
un indicatore inaffidabile del consumo di memoria, specialmente per le estensioni di terze parti.
resize
sta restituendo un view
, non un nuovo array. Stai ottenendo le dimensioni della vista, non i dati effettivi.
sys.getsizeof(albedo.base)
darà la dimensione della non vista.
sys.getsizeof
: "Restituisce la dimensione di un oggetto in byte. L'oggetto può essere qualsiasi tipo di oggetto. Tutti gli oggetti incorporati restituiranno risultati corretti, ma ciò non deve valere per le estensioni di terze parti così com'è specifica dell'implementazione. Viene presa in considerazione solo il consumo di memoria direttamente attribuito all'oggetto, non il consumo di memoria degli oggetti a cui fa riferimento. "