Tôi đang sử dụng python để phân tích một số tệp lớn và tôi đang gặp vấn đề về bộ nhớ, vì vậy tôi đã sử dụng sys.getsizeof () để thử và theo dõi việc sử dụng, nhưng hành vi của nó với các mảng khó hiểu là kỳ quái. Dưới đây là một ví dụ liên quan đến bản đồ các suất phản chiếu mà tôi phải mở:
>>> 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
Chà, dữ liệu vẫn còn đó, nhưng kích thước của đối tượng, bản đồ 3600x7200 pixel, đã tăng từ ~ 200 Mb đến 80 byte. Tôi muốn hy vọng rằng các vấn đề về trí nhớ của tôi đã kết thúc và chỉ chuyển đổi mọi thứ thành các mảng khó chịu, nhưng tôi cảm thấy rằng hành vi này, nếu đúng, theo một cách nào đó sẽ vi phạm một số định luật về lý thuyết thông tin hoặc nhiệt động lực học, hoặc một cái gì đó, vì vậy tôi có xu hướng tin rằng gotizeof () không hoạt động với các mảng numpy. Có ý kiến gì không?
getsizeof
một chỉ số không đáng tin cậy về mức tiêu thụ bộ nhớ, đặc biệt là các tiện ích mở rộng của bên thứ 3.
resize
là trả về một view
, không phải là một mảng mới. Bạn đang nhận được kích thước của chế độ xem, không phải dữ liệu thực tế.
sys.getsizeof(albedo.base)
sẽ cho kích thước của chế độ không xem.
sys.getsizeof
: "Trả về kích thước của một đối tượng theo byte. Đối tượng có thể là bất kỳ loại đối tượng nào. Tất cả các đối tượng tích hợp sẽ trả về kết quả chính xác, nhưng điều này không phải đúng với các tiện ích mở rộng của bên thứ ba vì nó là thực hiện cụ thể. Chỉ có mức tiêu thụ bộ nhớ được gán trực tiếp cho đối tượng, chứ không phải mức tiêu thụ bộ nhớ của các đối tượng mà nó đề cập đến. "