2012-08-02 2 views
84

파이썬을 사용하여 일부 큰 파일을 분석하고 있으며 메모리 문제로 인해 실행 중이므로 sys.getsizeof()를 사용하여 사용법을 추적하고 있습니다. numpy 배열을 사용한 동작은 기괴합니다. 여기에 내가 열 필요 해요 알베도의지도와 관련된 예입니다 : 여전히numpy 배열의 파이썬 메모리 사용

>>> 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 

음 데이터의를하지만, 오브젝트하는 3600x7200 픽셀 맵의 크기가 80 바이트 ~ 200 메가 사라 졌 . 내 기억 문제가 끝나기를 바라고 모든 것을 numpy 배열로 바꿔야 겠지만, 사실이 행동이 사실이라면 정보 이론이나 열역학 법칙을 위반하는 것이라고 생각합니다. getsizeof()가 numpy 배열에서는 작동하지 않는다고 생각하는 경향이 있습니다. 어떤 아이디어?

+4

를 : "개체의 크기를 바이트 단위로 반환합니다. 개체는 모든 유형의 개체가 될 수 있습니다. 모든 기본 제공 개체는 올바른 결과를 반환하지만 타사 확장이 구현과 관련되어있을 필요는 없습니다. 오직 메모리 소비량 만 객체에 기인 한 것이지, 참조하는 객체의 메모리 소비가 차지하는 것이 아닙니다. " –

+0

이렇게하면'getsizeof'는 메모리 소비에 대한 신뢰할 수없는 지표가되고, 특히 제 3 자 확장을 위해서는 _ getspecof가됩니다. –

+7

기본적으로, 여기의 문제는'resize'가 새로운 배열이 아닌'view'를 리턴한다는 것입니다. 실제 데이터가 아닌보기의 크기를 얻고 있습니다. – mgilson

답변

125

당신은 예를 들어, NumPy와 배열에 대한 array.nbytes를 사용할 수 있습니다

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

그게 전부입니다. albedo.nbytes는 예상대로 207360000을 제공합니다. 감사. – EddyTheB

+0

import sys를 수행 한 후 sys.getsizeof (a). – eddys

0

다음 작품을 새로운 배열을 생성 할 필요없이 : sys.getsizeof``에 워드 프로세서

import numpy as np 
a = np.arange(81).reshape(9,9) 
a.size * a.dtype.itemsize 
관련 문제