Chương trình tôi đã viết lưu trữ một lượng lớn dữ liệu trong từ điển. Cụ thể, tôi đang tạo ra 1588 trường hợp của một lớp, mỗi lớp chứa 15 từ điển với 1500 float để ánh xạ nổi. Quá trình này đã được sử dụng lên 2GB bộ nhớ trên máy tính xách tay của tôi khá nhanh (tôi bắt đầu viết để trao đổi vào khoảng lần thứ 1000 của lớp).Sử dụng bộ nhớ Python: Đối tượng nào của tôi đang chiếm nhiều bộ nhớ nhất?
Câu hỏi của tôi là điều nào sau đây là sử dụng hết bộ nhớ của tôi?
- 34 triệu một số phao nổi?
- Chi phí của 22.500 từ điển?
- chi phí của 1500 lớp học?
Với tôi, có vẻ như bộ nhớ hog phải là số lượng lớn các số dấu phẩy động mà tôi đang giữ trong bộ nhớ. Tuy nhiên, nếu những gì tôi đã đọc cho đến nay là chính xác, mỗi số dấu phẩy động của tôi chiếm 16 byte. Vì tôi có 34 triệu đôi, nên khoảng 108 triệu byte, chỉ hơn một gigabyte.
Có điều gì tôi không xem xét ở đây không?
Nếu tôi cắm phạm vi (1000) hoặc phạm vi (1250) thay vì 1500 trong mã của bạn ở trên, tôi nhận được kích thước 24712 byte. Điều này có vẻ đúng cho đến khi phạm vi (1365) tại thời điểm đó có một bước nhảy kín đáo về kích thước. Điều này đúng với cách python phân bổ bộ nhớ? Nếu vậy, tại sao lại như vậy? – Wilduck
Tôi mặc dù một phao Python được thực hiện bằng cách sử dụng một đôi C, mà nói chung sẽ là 64-bit (8 byte). Và kiểu double có 8 byte trong mô-đun 'struct'. Tôi không thể tranh luận với kết quả của 'getizeof' mặc dù ... –
@Scott, mọi đối tượng Python có một số chi phí (bộ đếm tham chiếu, con trỏ đến kiểu) ngoài" trọng tải "của nó, và tất cả các phân bổ được làm tròn lên đến nhiều 16 byte để chơi độc đáo cùng với hệ thống malloc. Để giữ cho nổi nhỏ gọn, bạn có thể sử dụng một 'mảng.array' của chúng (nhưng đó là danh sách giống, không giống như dict). –