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?
getsizeof
że wskaźnik zużycia pamięci jest zawodny, szczególnie w przypadku rozszerzeń innych firm.
resize
zwraca a view
, a nie nową tablicę. Otrzymujesz rozmiar widoku, a nie rzeczywiste dane.
sys.getsizeof(albedo.base)
poda rozmiar braku widoku.
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. "