kwa*_*ord 8 matlab garbage-collection memory-management weak-references
在考虑MATLAB中基于句柄类的ORM的可能性时,出现了缓存实例的问题.我无法立即想出一种制作弱引用或弱映射的方法,尽管我猜测可以用事件监听器来设计一些东西.有任何想法吗?
在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 惯用的做法。
| 归档时间: |
|
| 查看次数: |
1778 次 |
| 最近记录: |