web-dev-qa-db-fra.com

Python utilisation de la mémoire des tableaux numpy

J'utilise python pour analyser de gros fichiers. Je rencontre des problèmes de mémoire. Je me sers donc de sys.getsizeof () pour essayer de garder une trace de l'utilisation, mais c'est Le comportement avec les tableaux numpy est bizarre. Voici un exemple de 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

Les données sont toujours là, mais la taille de l'objet, une carte 3600x7200 pixels, est passée d'environ 200 Mo à 80 octets. J'espère que mes problèmes de mémoire sont résolus et que je convertis simplement tout en tableaux numpy, mais j’ai le sentiment que ce comportement, s’il était vrai, violerait en quelque sorte une loi de la théorie de l’information ou de la thermodynamique, ou quelque chose du genre; enclin à croire que getsizeof () ne fonctionne pas avec les tableaux numpy. Des idées?

132
EddyTheB

Vous pouvez utiliser array.nbytes pour les tableaux numpy, par exemple:

>>> import numpy as np
>>> from sys import getsizeof
>>> a = [0] * 1024
>>> b = np.array(a)
>>> getsizeof(a)
8264
>>> b.nbytes
8192
198
GWW

Le champ nbytes vous donnera la taille en octets de tous les éléments du tableau dans un numpy.array:

size_in_bytes = my_numpy_array.nbytes

Notez que cela ne mesure pas les "attributs non-élément de l'objet tableau", la taille réelle en octets peut donc être supérieure de quelques octets à celle-ci.

4
El Marce