8

在考虑 MATLAB 中基于句柄类的 ORM 的可能性时,缓存实例的问题出现了。我无法立即想到一种方法来制作弱引用或弱映射,尽管我猜测事件监听器可能会设计一些东西。有任何想法吗?

更多信息

在 MATLAB 中,句柄类(与值类相反)具有引用语义。MATLAB 中包含的一个示例是containers.Map该类。如果您实例化一个并将其传递给函数,则该函数对对象所做的任何修改都将通过原始引用可见。也就是说,它像 Java 或 Python 对象引用一样工作。

与 Java 和 Python 一样,MATLAB 以一种或另一种方式跟踪有多少事物正在引用句柄类的每个对象。当不再有对象时,MATLAB 知道删除该对象是安全的。

弱引用是指引用对象但不计为垃圾收集目的的引用。因此,如果对对象的唯一剩余引用很弱,则可以将其丢弃。通常可以向弱引用提供事件或回调 - 当对象被丢弃时,将通知对它的弱引用,从而允许运行清理代码。

例如,弱值映射类似于法线映射,不同之处在于值(与键相对)是作为弱引用实现的。弱映射类可以在每个弱引用上安排回调或事件,以便在删除引用的对象时,删除映射中的键/值条目,保持映射整洁。

4

2 回答 2

3

这不是您的问题的答案,而只是我的 2 美分。

弱引用是垃圾收集器的一个特性。在 Java 和 .NET 中,当内存压力很大时会调用垃圾收集器,因此是不确定的。

这篇 MATLAB Digest 帖子说 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 对象缓存(可能使用由哈希码键控的容器。映射),在添加新对象时显式删除其中的对象。直接使用它,或者向您的对象添加 onCleanup() 行为,让它们自动将自己的副本添加到固定大小的全局“最近删除的对象”LRU缓存,由外部有意义的 id 键入,并将实例标记为缓存,因此您的 onCleanup() 方法在由于缓存过期而被删除时不会尝试重新添加它们。然后,您可以使用工厂方法或其他查找方法从缓存中“复活”实例,而不是以昂贵的方式构建全新的实例。不过,这听起来像是很多工作,而且真的不是惯用的 Matlab。

于 2010-12-17T18:51:15.403 回答