ฉันใช้หลามเพื่อวิเคราะห์ไฟล์ขนาดใหญ่และฉันพบปัญหาเรื่องหน่วยความจำดังนั้นฉันจึงใช้ sys.getsizeof () เพื่อพยายามติดตามการใช้งาน แต่พฤติกรรมของอาร์เรย์ 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 พิกเซลได้หายไปจาก ~ 200 Mb ถึง 80 bytes ฉันหวังว่าปัญหาหน่วยความจำของฉันจะจบลงและเพียงแค่แปลงทุกอย่างให้เป็นอาร์เรย์ที่มีจำนวนมาก แต่ฉันรู้สึกว่าพฤติกรรมนี้ถ้าเป็นจริงจะเป็นการละเมิดกฎหมายของทฤษฎีข้อมูลหรืออุณหพลศาสตร์หรือบางอย่างดังนั้น มีแนวโน้มที่จะเชื่อว่า getizeof () ไม่ทำงานกับอาร์เรย์ที่มีค่ามาก ความคิดใด ๆ
getsizeof
ตัวบ่งชี้ที่ไม่น่าเชื่อถือของการใช้หน่วยความจำโดยเฉพาะอย่างยิ่งสำหรับส่วนขยายของบุคคลที่สาม
resize
คือการส่งคืนview
ไม่ใช่อาร์เรย์ใหม่ คุณได้ขนาดของมุมมองไม่ใช่ข้อมูลจริง
sys.getsizeof(albedo.base)
จะทำให้ขนาดของมุมมองที่ไม่ใช่
sys.getsizeof
: "ส่งคืนขนาดของวัตถุเป็นไบต์วัตถุสามารถเป็นวัตถุชนิดใดก็ได้วัตถุในตัวทั้งหมดจะส่งคืนผลลัพธ์ที่ถูกต้อง แต่ไม่ต้องถือเป็นจริงสำหรับส่วนขยายของบุคคลที่สาม มีการใช้งานเฉพาะหน่วยความจำที่ประกอบโดยตรงกับวัตถุเท่านั้นที่จะถูกนำมาใช้