[python] numpy 배열의 파이썬 메모리 사용

파이썬을 사용하여 큰 파일을 분석하고 메모리 문제가 발생하고 있으므로 sys.getsizeof ()를 사용하여 사용량을 추적하려고 시도했지만 사용량이 많은 배열의 동작은 기괴합니다. 다음은 내가 열어야 할 알베도 스 맵과 관련된 예입니다.

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

데이터는 여전히 존재하지만 3600×7200 픽셀 맵인 객체의 크기는 ~ 200Mb에서 80 바이트로 줄었습니다. 메모리 문제가 끝나고 모든 것을 numpy 배열로 변환하기를 희망하지만이 행동이 사실이라면 어떤 식 으로든 정보 이론이나 열역학 또는 무언가를 위반 할 것이라고 생각합니다. getsizeof ()는 numpy 배열에서 작동하지 않는다고 생각했습니다. 어떤 아이디어?



답변

array.nbytesnumpy 배열에 사용할 수 있습니다 ( 예 :

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


답변

nbytes 필드 는 배열의 모든 요소의 크기를 바이트 단위로 표시합니다 numpy.array.

size_in_bytes = my_numpy_array.nbytes

이것은 “배열 객체의 비 요소 속성”을 측정하지 않으므로 실제 크기 (바이트)는 이보다 몇 바이트 더 클 수 있습니다.


답변

파이썬 노트북에서 나는 종종 ‘매달려’필터링 할 numpy.ndarray의, 특히에 저장되어있는 사람 _1, _2정말 의미하지 않았다 등이 살아 남기 위해.

이 코드를 사용하여 모든 코드와 크기 목록을 가져옵니다.

locals()또는 globals()더 나은지 확실하지 않습니다 .

import sys
import numpy
from humanize import naturalsize

for size, name in sorted(
    (value.nbytes, name)
    for name, value in locals().items()
    if isinstance(value, numpy.ndarray)):
  print("{:>30}: {:>8}".format(name, naturalsize(size)))


답변