8

MATLABでのハンドルクラスベースのORMの可能性について考えているときに、インスタンスのキャッシュの問題が発生しました。弱い参照や弱いマップを作成する方法をすぐに考えることはできませんでしたが、イベントリスナーで何かが考案される可能性があると思います。何か案は?

より詳しい情報

MATLABでは、(値クラスではなく)ハンドルクラスに参照セマンティクスがあります。MATLABに含まれている例は、containers.Mapクラスです。1つをインスタンス化して関数に渡すと、関数がオブジェクトに加えた変更はすべて、元の参照を介して表示されます。つまり、JavaまたはPythonオブジェクト参照のように機能します。

JavaやPythonと同様に、MATLABは、ハンドルクラスの各オブジェクトを参照しているものの数を何らかの方法で追跡します。これ以上存在しない場合、MATLABはオブジェクトを安全に削除できることを認識しています。

弱参照とは、オブジェクトを参照するものですが、ガベージコレクションの目的での参照としてはカウントされません。したがって、オブジェクトへの残りの参照のみが弱い場合、それは破棄される可能性があります。通常、イベントまたはコールバックは弱参照に提供できます。オブジェクトが破棄されると、そのオブジェクトへの弱参照が通知され、クリーンアップコードを実行できるようになります。

たとえば、弱値マップは、値(キーではなく)が弱参照として実装されることを除いて、法線マップに似ています。弱いマップクラスは、これらの弱い参照のそれぞれにコールバックまたはイベントを配置できるため、参照されるオブジェクトが削除されると、マップ内のキー/値エントリが削除され、マップが適切に整理されます。

4

2 に答える 2

3

これはあなたの質問に対する答えではなく、私の2セントです。

弱参照はガベージコレクターの機能です。Javaおよび.NETでは、メモリへの負荷が高く、したがって不確定な場合にガベージコレクタが呼び出されます。

このMATLABダイジェストの投稿は、MATLABが(非決定論的な)ガベージコレクターを使用していないことを示しています。MATLABでは、参照は各スタックポップで(決定論的に)メモリから削除されます。つまり、各関数を離れるときに削除されます。

したがって、弱参照はMATLAB参照処理の概念に属するとは思いません。しかし、MATLABには常に文書化されていない機能がたくさんあるので、どこかに埋もれていることを排除することはできません。

このSOの投稿では、MATLABガベージコレクターの実装について質問しましたが、実際の答えは得られませんでした。私の質問に答える代わりに、あるMathWorksスタッフのメンバーが、PythonとMATLABの引数を作成しようとしたと非難しました。別のMathWorksスタッフのメンバーは、合理的に見えるものを書きましたが、実質的には巧妙な欺瞞であり、私が尋ねた問題から意図的に注意をそらしました。そして、最良の答えは次のとおりです。

この質問をする場合、MATLABは適切な言語ではありません。

于 2010-12-16T21:03:04.290 に答える
3

これらの特別な参照型は、実際には言語レベルの機能であり、VMとGCで実行する必要があります。これをユーザーコードに実装しようとすると、特に文書化されていない動作に頼っている場合は、涙が出る可能性があります。(泥棒になってすみません。)

同様のことを行う方法はいくつかあります。これらは単なるアイデアであり、承認ではありません。私は実際にそれらをしていません。

おそらく、Matlabオブジェクトインスタンス自体をキャッシュする代わりに、Matlab内に埋め込まれたJVMで実際のJava弱参照マップを使用して高価な計算結果をキャッシュすることができます。Matlabの値をJavaとの間で比較的迅速に変換できる場合、これは成功する可能性があります。比較的フラットな数値データの場合、double[]やdouble[] []などのプリミティブは、Matlabの暗黙的な変換を使用してすばやく変換します。

または、Matlabレベルで通常のLRUオブジェクトキャッシュを作成して(おそらく、ハッシュコードでキー設定されたcontainers.Mapを使用して)、新しいオブジェクトが追加されたときにその中のオブジェクトを明示的に削除することもできます。直接使用するか、オブジェクトにonCleanup()動作を追加して、外部的に意味のあるIDでキー設定された、固定サイズのグローバルな「最近削除されたオブジェクト」LRUキャッシュに自分自身のコピーを自動的に追加し、インスタンスをマークします。キャッシュの有効期限が切れたために削除されたときに、onCleanup()メソッドがそれらを再追加しようとしないようにキャッシュします。次に、高価な方法で新しいインスタンスを作成する代わりに、ファクトリメソッドまたは他のルックアップメソッドでキャッシュからインスタンスを「復活」させることができます。ただし、これは多くの作業のように聞こえますが、実際には慣用的なMatlabではありません。

于 2010-12-17T18:51:15.403 に答える