2011-09-07 2 views
9

他の言語(Javaなど)では、オブジェクト参照は強、弱、弱、またはファントム(http://weblogs.java.net/blog/enicholas/archive/2006/05/understanding_w.html)です。Pythonで「ソフトリファレンス」を使用できますか?

Pythonでは、参照はデフォルトでStrongで、WeakRefモジュールは弱い参照を許可します。

Pythonで「ソフトリファレンス」を使用することはできますか?

私の特別なケースでは、作成に時間がかかるオブジェクトのキャッシュがあります。場合によっては、キャッシュされたオブジェクトへの参照がない場合もありますが、キャッシュされたオブジェクトを投げ捨てる必要はありません(つまり、メモリが豊富な場合)。

答えて

6

Pythonは、ハード(別名強い)以外の参照のフレーバーをネイティブに提供しません&弱いです。

つまり、hereは、私が必要としたいくつかの場所で使ってきた1年ほど前のことです。それが提供するものは実際のソフトリファレンスであるではありませんが、ほとんどのユースケースでは近いです。それは端に少し荒いですが、完全に機能しています...内部的にはCPythonを除いて何かを打ち破ることになるでしょう。

特に、私は高価な長寿命オブジェクトのキャッシュのためにそれを正確に書きました... SoftValueDictionaryは、あなたが探しているものと正確に一致する必要があります。

+0

このファイルは、AFAICSの著作権で、配布/再利用権はありません。 –

+3

@JamesBlackburn私の謝罪は、私のdevフォルダからあまり考えずにそのスクリプトを取り出しました。 BSDライセンスを含むようにファイルを更新しました。 –

+0

これは[私の質問](http://stackoverflow.com/questions/14099804/object-pool-under-memory-constraints)への素晴らしい答えです。 Cのmallocの別の実装でPythonを再コンパイルせずに、私はもっと良いものは考えられません。 – max

0

もう1つの方法は、明示的にメモリ消費量を計算するのではなく、一定数のオブジェクト(たとえば100)を保持するキャッシュを使用することです。オブジェクトにアクセスすると、キャッシュの先頭に置かれるか、キャッシュの最下部のオブジェクトが新しいオブジェクトに置き換えられます。

理論化されていません。

関連する問題