J'utilise python pour analyser certains fichiers volumineux et je rencontre des problèmes de mémoire, j'ai donc utilisé sys.getsizeof () pour essayer de garder une trace de l'utilisation, mais son comportement avec les tableaux numpy est bizarre. Voici un exemple impliquant une carte d'albédos que je dois ouvrir:
>>> 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
Eh bien, les données sont toujours là, mais la taille de l'objet, une carte de 3600x7200 pixels, est passée d'environ 200 Mo à 80 octets. J'espère que mes problèmes de mémoire sont terminés et que je convertis simplement tout en tableaux numpy, mais je pense que ce comportement, s'il est vrai, violerait d'une certaine manière une loi de la théorie de l'information ou de la thermodynamique, ou quelque chose comme ça, alors je suis enclin à croire que getsizeof () ne fonctionne pas avec les tableaux numpy. Des idées?
sys.getsizeof
: "Renvoie la taille d'un objet en octets. L'objet peut être n'importe quel type d'objet. Tous les objets intégrés renverront des résultats corrects, mais cela ne doit pas nécessairement être vrai pour les extensions tierces. spécifique à l'implémentation. Seule la consommation de mémoire directement attribuée à l'objet est prise en compte, et non la consommation de mémoire des objets auxquels il fait référence. "getsizeof
un indicateur peu fiable de la consommation de mémoire, en particulier pour les extensions tierces.resize
renvoyer unview
tableau, pas un nouveau tableau. Vous obtenez la taille de la vue, pas les données réelles.sys.getsizeof(albedo.base)
donnera la taille de la non-vue.Réponses:
Vous pouvez utiliser
array.nbytes
pour les tableaux numpy, par exemple:la source
b.__sizeof__()
équivaut àsys.getsizeof(b)
round(getsizeof(a) / 1024 / 1024,2)
pour obtenir MBLe champ nbytes vous donnera la taille en octets de tous les éléments du tableau dans un
numpy.array
:Notez que cela ne mesure pas les «attributs non élémentaires de l'objet tableau», de sorte que la taille réelle en octets peut être supérieure de quelques octets.
la source
Dans les ordinateurs portables de python Je veux souvent filtrer « ballants »
numpy.ndarray
« s, en particulier ceux qui sont stockés dans_1
,_2
, etc. qui ont jamais été vraiment destiné à rester en vie.J'utilise ce code pour obtenir une liste de tous et de leur taille.
Je ne sais pas si
locals()
ouglobals()
est mieux ici.la source