Używam Pythona do analizy niektórych dużych plików i mam problemy z pamięcią, więc używam sys.getsizeof (), aby śledzić użycie, ale jego zachowanie z tablicami numpy jest dziwne. Oto przykład obejmujący mapę albedo, którą muszę otworzyć:
>>> 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
Cóż, dane nadal tam są, ale rozmiar obiektu, mapy o rozdzielczości 3600x7200 pikseli, wzrósł z ~ 200 Mb do 80 bajtów. Chciałbym mieć nadzieję, że problemy z pamięcią się skończyły i po prostu przekonwertować wszystko na tablice numpy, ale czuję, że to zachowanie, jeśli jest prawdą, w jakiś sposób naruszy jakieś prawo teorii informacji lub termodynamiki, czy coś, więc jestem skłonny wierzyć, że getsizeof () nie działa z tablicami numpy. Jakieś pomysły?
sys.getsizeof
: „Zwróć rozmiar obiektu w bajtach. Obiekt może być obiektem dowolnego typu. Wszystkie obiekty wbudowane zwrócą poprawne wyniki, ale nie musi to obowiązywać w przypadku rozszerzeń innych firm. specyficzne dla implementacji. Uwzględniane jest tylko zużycie pamięci bezpośrednio przypisane do obiektu, a nie zużycie pamięci przez obiekty, do których się odnosi. "getsizeof
że wskaźnik zużycia pamięci jest zawodny, szczególnie w przypadku rozszerzeń innych firm.resize
zwraca aview
, a nie nową tablicę. Otrzymujesz rozmiar widoku, a nie rzeczywiste dane.sys.getsizeof(albedo.base)
poda rozmiar braku widoku.Odpowiedzi:
Możesz użyć
array.nbytes
dla numpy tablic, na przykład:źródło
b.__sizeof__()
jest odpowiednikiemsys.getsizeof(b)
round(getsizeof(a) / 1024 / 1024,2)
aby zdobyć MBPole nbytes podaje rozmiar w bajtach wszystkich elementów tablicy w a
numpy.array
:Zauważ, że to nie mierzy "atrybutów nieelementowych obiektu tablicy", więc rzeczywisty rozmiar w bajtach może być o kilka bajtów większy.
źródło
W notatnikach Pythona często chcę odfiltrować „wiszące”
numpy.ndarray
, w szczególności te, które są przechowywane w_1
,_2
itp, które nigdy nie były naprawdę znaczy żyć.Używam tego kodu, aby uzyskać listę wszystkich z nich i ich rozmiar.
Nie jestem pewien,
locals()
czyglobals()
tutaj jest lepiej.źródło