在考虑MATLAB中基于句柄类的ORM的可能性时,出现了缓存实例的问题。我无法立即想出一种制作弱引用或弱映射的方法,尽管我猜测可以用事件监听器来设计一些东西。有任何想法吗?
在MATLAB中,句柄类(与值类相对)具有引用语义。 MATLAB中包含的示例是containers.Map
类。如果实例化一个并将其传递给函数,则函数对该对象所做的任何修改都将通过原始引用显示。也就是说,它的工作方式类似于Java或Python对象引用。
与Java和Python一样,MATLAB以一种或另一种方式跟踪引用句柄类的每个对象的内容。如果没有,MATLAB知道删除对象是安全的。
弱引用是指引用该对象但不计入垃圾收集目的的引用。因此,如果对象的唯一剩余引用很弱,那么它可以被抛弃。通常可以向弱引用提供事件或回调 - 当对象被丢弃时,将通知对它的弱引用,允许清理代码运行。
例如,弱值映射就像普通映射,除了值(与键相对)实现为弱引用。弱映射类可以在每个弱引用上安排回调或事件,以便在删除引用的对象时,删除映射中的键/值条目,使映射保持整洁。
答案 0 :(得分:3)
这不是你问题的答案,只是我的2美分。
弱引用是垃圾收集器的一个特性。在Java和.NET中,当内存压力很大时,就会调用垃圾收集器,因此它是不确定的。
This MATLAB Digest post说MATLAB没有使用(不确定的)垃圾收集器。在MATLAB中,引用(确定性地)从每个堆栈弹出中删除引用,即在离开每个函数时。
因此,我认为弱引用不属于MATLAB参考处理概念。但是MATLAB总是有大量的无证功能,所以我不能排除它被埋在某个地方。
在this SO post中,我询问了MATLAB垃圾收集器的实现,并没有得到真正的答案。一个MathWorks的成员而不是回答我的问题指责我尝试构建Python与MATLAB参数。另一个MathWorks的东西成员写了一些看似合理的东西,但实质上是一个聪明的欺骗 - 有目的地分散了我所问的问题。最好的答案是:
如果你问这个问题,那么MATLAB 对你来说不是正确的语言!
答案 1 :(得分:3)
这些特殊引用类型实际上是一种语言级功能,您需要VM和GC来执行此操作。试图在用户代码中实现它可能会流泪,特别是如果你依赖于未记录的行为。 (抱歉在泥泞中坚持下去。)
有几种方法可以做类似的事情。这些只是想法,而不是认可;我实际上没有做过。
也许不是在本身缓存Matlab对象实例,而是使用嵌入在Matlab中的JVM中的真实Java弱引用映射来缓存昂贵的计算结果。如果你可以相对快速地将你的Matlab值转换为Java,那么这可能是一个胜利。如果它是相对平坦的数值数据,那么像double []或double [] []这样的基元可以使用Matlab的隐式转换快速转换。
或者你可以在Matlab级别(可能使用由hashcodes键控的containers.Map)制作一个常规的LRU对象缓存,当添加新的对象时,它会显式删除其中的对象。直接使用它,或者向对象添加onCleanup()行为,让它们自动将自己的副本添加到固定大小的全局“最近删除的对象”LRU缓存中,由外部有意义的id键入,并在中标记实例缓存,因此onCleanup()方法由于缓存过期而被删除时,不会尝试重新添加它们。然后你可以从缓存中获得工厂方法或其他查找方法“复活”实例,而不是以昂贵的方式构建全新的实例。这听起来像是很多工作,但实际上并不是惯用的Matlab。