2011-12-08 11 views
6

私は、次の機能をmemoizeデコレータを提供していますPythonのモジュールのためのビットを探していますpython用に確立されたmemoizeディスクデコレータはありますか?

  • 店舗は、後続のプログラムの実行の間で再利用するために、ディスクにキャッシュします。
  • pickle可能な引数、特に重要なnumpy配列に対応しています。
  • (ボーナス)は、引数が関数呼び出しで変更されているかどうかを確認します。

私はこのタスクのコードスニペットをいくつか見つけましたが、おそらく自分自身を実装することができましたが、このタスクのために確立されたパッケージが好きです。私もincpyが見つかりましたが、標準のPythonインタプリタでは動作しません。

理想的には、ディスク上にfunctools.lru_cacheとキャッシュストレージを追加したいと考えています。誰かがこれに適したパッケージに私を向けることができますか?

答えて

2

私はすべてを気にするメモデコレータについてはわかりませんが、ZODBを見てみたいかもしれません。 pickleの上に構築された永続性システムで、使用されていないときにオブジェクトをメモリからディスクに移動できるようにする機能や、変更されたオブジェクトのみを保存する機能などがあります。

編集:コメントのフォローアップとして。メモ化デコレータは、ZODBによってすぐにサポートされていません。しかし、私はあなたができると思う:

  • は、あなたが(任意の標準実装が動作するはずです必要な方法でメモ化デコレータを使用して、独自のpersistent class
  • を実装し、それはおそらくdirty bitであることを確認するために修正する必要がありますセット)その後

、あなたがメモ化の方法のいずれかを実行するときに、そのクラスのオブジェクトを作成し、ZODBデータベースに追加した場合、オブジェクトがダーティとしてマークされ、変更内容がに保存されます次のトランザクションコミット操作のデータベース。

+0

ヒントをお寄せいただきありがとうございます。だから、ZODBは、メモリやディスクに柔軟にデータを格納するのにはかなり良いと思われます。しかし、メモの文脈では大きな利点は何でしょうか? – silvado

+0

私は、永続クラスはmemoizationデコレータが定義されているクラスでなければならないと思います。memoizationキャッシュはそのクラスの属性になります。私は近いうちにこれを試してみる... – silvado

2

私は、これはあなたが本当に心配する必要がないということは十分に簡単です

これは2歳の問題であり、これは「確立」デコレータとしてカウントされないだろうことを実現、しかし...確立されたコードのみを使用します。モジュールのdocssourceへリンクしています。それは、それ自体が有用であることに加えて、サンプルコードとして機能するためです。

だから、あなたは何を追加する必要がありますか? filenameパラメータを追加します。実行時にpickle.loadのファイル名がcacheになり、失敗した場合は{}を使用します。 cache_save機能を追加して、ロックの下にあるファイルにキャッシュをpickle.saveだけ追加します。その機能を既存のものと同一のwrapperに接続してください(cache_infoなど)。

キャッシュを自動的に保存する場合は、キャッシュを呼び出し元に委ねるのではなく、簡単です。それはいつ行うべきかの問題です。任意のオプション - atexit.registerを入力し、save_every引数を追加すると、すべてのsave_everyミスが節約されるため、実装するのは簡単です。 this answerでは、私はそれに要する仕事がどれほど少ないかを示しました。または、完全な作業用バージョン(カスタマイズするため、またはそのまま使用する)on GitHubを入手することもできます。

これ以外にも、cache_infoにいくつかの保存関連の統計情報(最終保存時間、最後の保存以降のヒット数、ミスなど)を入れて、キャッシュをコピーして保存するのではなく、バックグラウンドスレッドに保存しますそれはインラインです。しかし、私はそれが簡単ではないことに価値があるものは考えられません。

関連する問題