Saya menggunakan python untuk menganalisis beberapa file besar dan saya mengalami masalah memori, jadi saya telah menggunakan sys.getsizeof () untuk mencoba dan melacak penggunaan, tetapi perilakunya dengan array numpy adalah aneh. Berikut ini contoh yang melibatkan peta albedo yang harus saya buka:
>>> 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
Yah data masih di sana, tetapi ukuran objek, peta 3600x7200 piksel, telah berubah dari ~ 200 Mb menjadi 80 byte. Saya ingin berharap masalah ingatan saya selesai dan hanya mengubah segalanya menjadi array numpy, tetapi saya merasa bahwa perilaku ini, jika benar, dalam beberapa cara akan melanggar beberapa teori teori informasi atau termodinamika, atau sesuatu, jadi saya cenderung percaya bahwa getsizeof () tidak berfungsi dengan array numpy. Ada ide?
sys.getsizeof
: "Kembalikan ukuran objek dalam byte. Objek tersebut dapat berupa jenis objek apa pun. Semua objek bawaan akan mengembalikan hasil yang benar, tetapi ini tidak harus berlaku untuk ekstensi pihak ketiga seperti itu implementasi spesifik. Hanya konsumsi memori yang secara langsung dikaitkan dengan objek dipertanggungjawabkan, bukan konsumsi memori objek yang dimaksud. "getsizeof
indikator konsumsi memori tidak dapat diandalkan, terutama untuk ekstensi pihak ke-3.resize
adalah mengembalikan aview
, bukan array baru. Anda mendapatkan ukuran tampilan, bukan data aktual.sys.getsizeof(albedo.base)
akan memberikan ukuran non-view.Jawaban:
Anda dapat menggunakan
array.nbytes
untuk array numpy, misalnya:sumber
b.__sizeof__()
setara dengansys.getsizeof(b)
round(getsizeof(a) / 1024 / 1024,2)
untuk mendapatkan MBField nbytes akan memberi Anda ukuran dalam byte dari semua elemen array dalam
numpy.array
:Perhatikan bahwa ini tidak mengukur "atribut non-elemen objek array" sehingga ukuran sebenarnya dalam byte bisa beberapa byte lebih besar dari ini.
sumber
Di notebook python saya sering ingin menyaring 'menggantung'
numpy.ndarray
's, khususnya orang-orang yang disimpan dalam_1
,_2
, dll yang tidak pernah benar-benar dimaksudkan untuk tetap hidup.Saya menggunakan kode ini untuk mendapatkan daftar semuanya dan ukurannya.
Tidak yakin apakah
locals()
atauglobals()
lebih baik di sini.sumber