2010-06-21 44 views
5

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?

Trả lời

7

Các phao nổi làm mất 16 byte mỗi người, và một dict với 1500 mục về 100k:

>> sys.getsizeof(1.0) 
16 
>>> d = dict.fromkeys((float(i) for i in range(1500)), 2.0) 
>>> sys.getsizeof(d) 
98444 

nên 22.500 dicts mất hơn 2GB tất cả bởi chính mình, những 68 triệu nổi khác GB hoặc lâu hơn. Không chắc chắn cách bạn tính 68 triệu lần 16 chỉ bằng 100 triệu - bạn có thể đã giảm số 0 ở đâu đó.

Bản thân lớp học chiếm một số lượng không đáng kể và 1500 trường hợp của chúng (lưới của các đối tượng mà chúng tham chiếu tất nhiên, giống như getsizeof cung cấp cho chúng tôi số tiền ròng như vậy). , đó không phải là vấn đề. Tức là .:

>>> sys.getsizeof(Sic) 
452 
>>> sys.getsizeof(Sic()) 
32 
>>> sys.getsizeof(Sic().__dict__) 
524 

452 cho lớp, (524 + 32) * 1550 = 862K cho tất cả các trường hợp, như bạn thấy đó không phải là lo lắng khi bạn có gigabyte mỗi trong dicts và nổi.

+0

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

+0

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ù ... –

+1

@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). –

Các vấn đề liên quan