2011-12-08 16 views
6

Tôi đã được tìm kiếm một chút cho một mô-đun python mà cung cấp một trang trí memoize với các khả năng sau:Có một bộ ghi trang trên đĩa đã được thiết lập cho python không?

  • Stores bộ nhớ cache trên đĩa để được tái sử dụng trong chạy chương trình tiếp theo.
  • Làm việc cho bất kỳ đối số có thể chọn nào, quan trọng nhất là mảng có nhiều mảng.
  • (Tiền thưởng) kiểm tra xem các đối số có bị đột biến trong các cuộc gọi chức năng hay không.

Tôi đã tìm thấy một vài đoạn mã nhỏ cho tác vụ này và có thể có thể tự mình triển khai, nhưng tôi muốn có gói được thiết lập cho tác vụ này. Tôi cũng tìm thấy incpy, nhưng điều đó dường như không hoạt động với trình thông dịch chuẩn python.

Lý tưởng nhất, tôi muốn có một cái gì đó như functools.lru_cache cộng với bộ nhớ cache trên đĩa. Ai đó có thể chỉ cho tôi một gói phù hợp cho điều này?

Trả lời

2

Tôi không biết về bất kỳ công cụ ghi nhớ nào cần lưu ý tất cả điều đó, nhưng bạn có thể muốn xem ZODB. Đó là một hệ thống kiên trì được xây dựng trên đầu trang của pickle cung cấp một số tính năng bổ sung bao gồm việc có thể di chuyển các đối tượng từ bộ nhớ vào đĩa khi chúng không được sử dụng và khả năng chỉ lưu các đối tượng đã được sửa đổi.

Chỉnh sửa: Theo dõi nhận xét. Trình trang trí ghi nhớ không được ZODB hỗ trợ. Tuy nhiên, tôi nghĩ bạn có thể:

  • Thực hiện của riêng persistent class
  • Sử dụng trang trí memoization trong những phương pháp bạn cần (bất kỳ thực hiện tiêu chuẩn nên làm việc, nhưng nó có lẽ cần phải được sửa đổi để đảm bảo rằng các dirty bit là thiết lập)

Sau đó, nếu bạn tạo một đối tượng của lớp đó và thêm nó vào cơ sở dữ liệu ZODB, khi bạn thực hiện một trong các phương pháp ghi nhớ, đối tượng sẽ được đánh dấu là bẩn và thay đổi sẽ được lưu vào cơ sở dữ liệu trong hoạt động giao dịch tiếp theo.

+0

Cảm ơn gợi ý. Vì vậy, có vẻ như ZODB là khá tốt khi nói đến linh hoạt lưu trữ dữ liệu trong bộ nhớ hoặc trên đĩa. Nhưng điều gì sẽ là lợi thế đáng kể trong bối cảnh ghi nhớ? – silvado

+0

Vì vậy, tôi đoán lớp kiên trì nên là lớp nơi trang trí ghi nhớ được xác định và bộ nhớ cache ghi nhớ sẽ là thuộc tính của lớp đó. Tôi sẽ thử điều này trong tương lai gần ... – silvado

2

Tôi nhận ra đây là một câu hỏi 2 tuổi, và rằng điều này sẽ không được tính là một "thành lập" trang trí, nhưng ...

Đây là đủ đơn giản mà bạn thực sự không cần phải lo lắng về chỉ sử dụng mã được thiết lập. Liên kết docs của mô-đun với source vì, ngoài việc hữu ích theo cách riêng của nó, nó hoạt động như mã mẫu.

Vì vậy, bạn cần thêm gì? Thêm thông số filename. Vào thời gian chạy, pickle.load tên tệp vào số cache, sử dụng {} nếu không thành công. Thêm một hàm cache_save chỉ cần pickle.save s bộ nhớ cache vào tệp dưới khóa. Đính kèm chức năng đó vào wrapper giống như chức năng hiện tại (cache_info, v.v.).

Nếu bạn muốn lưu bộ nhớ cache tự động, thay vì để bộ nhớ cache đến người gọi, điều đó thật dễ dàng; nó chỉ là vấn đề khi làm như vậy. Bất kỳ tùy chọn nào bạn đưa ra— atexit.register, thêm một đối số save_every để nó tiết kiệm mỗi save_every bỏ lỡ,… —không thực hiện được. Trong this answer Tôi đã chỉ ra ít hoạt động.Hoặc bạn có thể nhận được phiên bản làm việc hoàn chỉnh (để tùy chỉnh hoặc sử dụng nguyên bản) on GitHub.

Có một số cách khác để bạn có thể mở rộng - lưu một số thống kê liên quan đến lưu (lưu lần cuối, lần truy cập và lần thoát kể từ lần lưu cuối cùng ...) trong cache_info, sao chép bộ nhớ cache và lưu nó vào chuỗi nền thay vì lưu nó nội tuyến, vv Nhưng tôi không thể nghĩ ra bất cứ điều gì đáng để làm điều đó sẽ không dễ dàng.

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