Tôi cần tối ưu hóa việc sử dụng RAM của ứng dụng.
XIN VUI LÒNG cho tôi những bài giảng nói với tôi rằng tôi không nên quan tâm đến bộ nhớ khi mã hóa Python. Tôi có vấn đề về bộ nhớ vì tôi sử dụng từ điển mặc định rất lớn (vâng, tôi cũng muốn nhanh). Mức tiêu thụ bộ nhớ hiện tại của tôi là 350MB và đang tăng lên. Tôi đã không thể sử dụng chia sẻ lưu trữ và nếu Apache của tôi mở ra nhiều quá trình bộ nhớ tăng gấp đôi và gấp ba ... và nó là tốn kém.
Tôi đã thực hiện hồ sơ mở rộng và tôi biết chính xác nơi mà vấn đề của tôi là.
Tôi có nhiều từ điển lớn (> 100K mục) với các phím Unicode. Một từ điển bắt đầu ở 140 byte và phát triển nhanh, nhưng vấn đề lớn hơn là các phím. Python tối ưu hóa chuỗi trong bộ nhớ (hoặc vì vậy tôi đã đọc) để tra cứu có thể được so sánh ID ('interning' chúng). Không chắc chắn điều này cũng đúng đối với các chuỗi unicode (tôi đã không thể 'intern' chúng).
Các đối tượng được lưu trữ trong từ điển là danh sách các bộ dữ liệu (an_object, int, int).Mẹo nhỏ để tối ưu hóa bộ nhớ
my_big_dict [some_unicode_string] .append ((my_object, an_int, another_int))
Tôi đã phát hiện ra rằng nó là giá trị thời gian để chia cho một số từ điển vì tuples mất rất nhiều không gian ..
Tôi thấy rằng tôi có thể tiết kiệm RAM bằng cách băm chuỗi trước khi sử dụng chúng làm khóa! Nhưng sau đó, thật đáng buồn, tôi gặp phải những va chạm sinh nhật trên hệ thống 32 bit của mình. (câu hỏi phụ: có từ điển khóa 64 bit tôi có thể sử dụng trên hệ thống 32 bit không?)
Python 2.6.5 trên cả Linux (sản xuất) và Windows. Bất kỳ mẹo nào về tối ưu hóa việc sử dụng bộ nhớ của từ điển/danh sách/bộ nhớ? Tôi thậm chí còn nghĩ đến việc sử dụng C - Tôi không quan tâm nếu đoạn mã rất nhỏ này là xấu. Nó chỉ là một vị trí số ít.
Cảm ơn trước!
2 nhận xét nhỏ: Tôi thực sự thích câu trả lời cấp hệ thống, nhưng có thể (ví dụ: cơ sở dữ liệu, ngay cả khi được lưu trong bộ nhớ cache) thực sự so sánh hiệu suất với từ điển Python không? Tôi đang chạy thuật toán thời gian thực và từ điển chỉ đủ nhanh. Tôi chắc chắn sẽ cố gắng memcached và Redis (cool) nhưng sẽ liên lạc quá trình liên thông đủ nhanh cho tôi? (xin lỗi vì đã thêm điều này ngay bây giờ. Khó tối ưu hóa cho cả bộ nhớ và tốc độ ...) Ngoài ra, từ điển của tôi chủ yếu là chỉ đọc. Tôi có thể sử dụng kiến thức này bằng cách nào đó không? –
"PEP 412: Từ điển chia sẻ khóa" có thể được bạn quan tâm. Tôi tin rằng nó được đưa vào Python 3.3 http://www.python.org/dev/peps/pep-0412/ – bcoughlan
@bcoughlan rất tuyệt, cảm ơn! Đáng buồn là tôi cần phải chờ đợi một 2.7 backport. –