gpt4 book ai didi

处理类对象的 MATLAB 弱引用

转载 作者:太空宇宙 更新时间:2023-11-03 19:24:47 24 4
gpt4 key购买 nike

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

更多信息

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

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

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

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

最佳答案

这些特殊的引用类型实际上是一种语言级别的功能,需要 VM 和 GC 来完成。尝试在用户代码中实现它可能会以泪流满面告终,尤其是如果您依赖于未记录的行为。 (很抱歉成为泥泞中的一根棍子。)

您可以通过多种方式来做类似的事情。这些只是想法,不是认可;我实际上还没有做过。

也许您可以在嵌入 Matlab 的 JVM 中使用真正的 Java 弱引用映射来缓存昂贵的计算结果,而不是缓存 Matlab 对象实例本身。如果您可以相对快速地将 Matlab 值与 Java 相互转换,那么这可能是一个胜利。如果它是相对平坦的数值数据,则 double[] 或 double[][] 等基元会使用 Matlab 的隐式转换快速转换。

或者您可以在 Matlab 级别创建一个常规的 LRU 对象缓存(可能使用以哈希码为键的 containers.Map),在添加新对象时显式删除其中的对象。要么直接使用它,要么给你的对象添加一个 onCleanup() 行为,让它们自动将自己的副本添加到一个固定大小的全局“最近删除的对象”LRU 缓存中,由一个外部有意义的 id 键控,并将实例标记在缓存,因此您的 onCleanup() 方法不会在它们因缓存过期而被删除时尝试重新添加它们。然后,您可以使用工厂方法或其他查找方法从缓存中“复活”实例,而不是以昂贵的方式构建全新的实例。不过,这听起来工作量很大,而且确实不是惯用的 Matlab。

关于处理类对象的 MATLAB 弱引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4463254/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com