2011-12-08 44 views
6

我一直在尋找一個位的Python模塊,提供了一個memoize的裝飾具有以下功能:後續的程序運行中重新使用在磁盤上是否有一個建立memoize磁盤裝飾器的Python?

  • 存儲緩存。
  • 適用於任何pickle-able參數,最重要的是numpy數組。
  • (Bonus)檢查參數是否在函數調用中發生了變異。

,我發現了幾個小的代碼段用於這個任務,很可能實現一個自己,但我寧願有一個既定的軟件包這一任務。我還發現incpy,但這似乎不適用於標準的Python解釋器。

理想情況下,我想有類似functools.lru_cache加上磁盤上的緩存存儲。有人可以指點我一個合適的包裝嗎?

回答

2

我不知道任何memoize裝飾,照顧所有這一切,但你可能想看看ZODB。它是一個構建於pickle之上的持久性系統,它提供了一些額外的功能,包括在不使用對象時可以將對象從內存移動到磁盤,並且只能保存已修改的對象。

編輯:作爲評論的後續行動。 ZODB不支持memoization裝飾器。不過,我覺得你可以:

  • 實現自己persistent class
  • 使用在您需要的方法記憶化裝飾(任何標準的實施應該工作,但它可能需要進行修改,以確保該dirty bit是設置)

後,如果您創建一個類的對象,並將其添加到ZODB數據庫,當你執行的memoized方法之一,該對象將被標記爲髒和變化將被保存到數據庫在下一個事務提交操作中。

+0

謝謝你的提示。因此,當將數據靈活地存儲在內存或磁盤上時,ZODB似乎相當不錯。但是在備忘錄的背景下會有什麼顯着的優勢? – silvado

+0

所以我想持久化類應該是memoization裝飾器被定義的類,並且memoization緩存將是該類的一個屬性。我會在不久的將來嘗試這個... – silvado

2

我意識到這是一個2歲的問題,這將不能算作一種「既定」的裝飾,但是...

這是很簡單的,你真的不需要擔心只使用已建立的代碼。該模塊的docs鏈接到source,因爲除了本身有用之外,它還可以用作示例代碼。

那麼,你需要添加什麼?添加一個filename參數。在運行時,pickle.load的文件名放入cache,如果失敗則使用{}。將只有pickle.save的緩存添加到cache_save函數中。將該功能附加到wrapper與現有的功能相同(cache_info等)。

如果你想自動保存緩存,而不是把它留給調用者,那很簡單;這只是時間問題。你拿出與 - atexit.register任何選項,添加save_every參數,所以它可以節省每save_every失誤,... -is微不足道的實施。在this answer我展示了它需要多少工作。或者你可以得到一個完整的工作版本(要定製,或按原樣使用)on GitHub

還有其他方法可以擴展它 - 在cache_info中放置一些與保存相關的統計信息(上次保存時間,點擊和未命中......),複製緩存並將其保存在後臺線程中而不是保存它內聯,等等。但我想不出任何值得做的事情,這不是件容易的事。