2014-05-05 22 views
6

Tôi đang sử dụng mã xây dựng của Python 3 functools.lru_cache để ghi nhớ một số chức năng đắt tiền. Tôi muốn ghi nhớ càng nhiều cuộc gọi càng tốt mà không cần sử dụng quá nhiều bộ nhớ, vì việc lưu vào bộ nhớ đệm quá nhiều giá trị gây ra sự lộn xộn.Bộ nhớ đệm LRU nhận biết bộ nhớ bằng Python?

Có kỹ thuật hoặc thư viện ưu tiên để hoàn thành điều này bằng Python không?

Ví dụ: this question dẫn tôi đến thư viện Go theo số system memory aware LRU caching. Một cái gì đó tương tự cho Python sẽ là lý tưởng.


Lưu ý: tôi có thể không chỉ là ước lượng bộ nhớ sử dụng cho mỗi giá trị và thiết lập maxsize phù hợp, vì một số quy trình sẽ được gọi hàm được trang trí song song; một giải pháp sẽ cần phải thực sự tự động kiểm tra dung lượng bộ nhớ còn trống.

+1

Nếu bạn không thể tìm thấy một cái gì đó ra khỏi đó mà thực hiện điều này đã có, bạn có thể thử tận dụng psutil (http://code.google.com/p/psutil/) để cuộn của bạn sở hữu. – dano

+0

Vâng, đó là những gì tôi đang xem xét ngay bây giờ - trên thực tế, bạn có biết làm thế nào để tìm nguồn cho việc triển khai 'lru_cache' của Python 3? Cách dễ nhất là chỉ cần kiểm tra việc sử dụng bộ nhớ trong trang trí. Nó sẽ thêm một số chi phí cho chắc chắn, nhưng trong ứng dụng này tôi không nghĩ rằng nó sẽ là đáng kể. – Will

+1

@Vẫn cho nguồn xem [functools.py:370](http://hg.python.org/cpython/file/5d0783376c88/Lib/functools.py#l370) và một vài dòng ở trên cho các chức năng của bộ nhớ cache. –

Trả lời

6

Tôi đã kết thúc sửa đổi được xây dựng trong lru_cache để sử dụng psutil.

Trình trang trí sửa đổi có thêm đối số tùy chọn use_memory_up_to. Nếu được đặt, bộ nhớ cache sẽ được coi là đầy đủ nếu có ít hơn use_memory_up_to byte bộ nhớ khả dụng (theo psutil.virtual_memory().available). Ví dụ:

from .lru_cache import lru_cache 

GB = 1024**3 

@lru_cache(use_memory_up_to=(1 * GB)) 
def expensive_func(args): 
    ... 

Lưu ý: thiết use_memory_up_to sẽ gây maxsize không có hiệu lực.

Dưới đây là các mã: lru_cache.py

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