【问题标题】:What's a simple way to design a memoization system with limited memory?设计内存有限的记忆系统的简单方法是什么?
【发布时间】:2025-12-12 03:20:04
【问题描述】:

我正在编写一个手动计算记忆系统(呃,在 Matlab 中)。简单的部分很简单:

  • 一种在执行计算后将数据放入记忆系统的方法。
  • 一种从记忆中查询和获取数据的方法。
  • 一种向系统查询所有“键”的方法。

这些部分没有太多疑问。问题是我的计算机内存有限,所以有时“放置”操作必须将一些对象转储出内存。我担心“缓存未命中”,所以我想要一些相对简单的系统来删除不经常使用和/或重新计算成本不高的记忆对象。我该如何设计那个系统?我可以想象它具有的部分:

  • 一种告诉“放置”操作的计算成本(相对而言)的方法。
  • 一种可选地向“put”操作提示可能需要多久计算一次的方法(未来)。
  • “get”操作需要注意查询给定对象的频率。
  • 一种告诉整个系统要使用的最大内存量的方法(好的,很简单)。

当你达到内存限制时,它的真正核心在于“放置”操作,它必须根据内存占用、成本和有用性来剔除一些对象。我该怎么做?

对不起,如果这太模糊或离题了。

【问题讨论】:

  • 如果您的问题更具体,您可能会得到更好的建议。有大量关于缓存设计的文献,但除非您更具体,否则不会有所帮助。不开玩笑,如果你的内存用完了,为什么不使用足够强大的硬件进行计算呢?如今,与设计适当的缓存行为所花费的工时相比,这非常便宜。谢谢
  • 嗯,是的,谢谢。我以为我是在要求将大量文学作品简单地提炼成一些小的经验法则。回复:电脑成本与工时,你可以和我老板谈谈购买硬件,或者你可以自己付钱给我...

标签: caching matlab memoization


【解决方案1】:

我会通过为DYNAMICPROPS 创建一个子类来做到这一点,该子类使用一个元胞数组在内部存储数据。这样,您可以向对象动态添加更多数据。

这是基本的设计理念:

数据存储在元胞数组中。每个属性都有自己的行,第一列是属性名称(为方便起见),第二列是计算数据的函数句柄,第三列是数据,第四列是生成数据所花费的时间,第五列是一个长度为 100 的数组,存储与最近 100 次访问该属性的时间相对应的时间戳,第六列包含可变大小。

有一个通用的 get 方法将对应于属性的行号作为输入(见下文)。 get 方法首先检查第 3 列是否为空。如果否,则返回值并存储时间戳。如果是,它使用TIC/TOC 语句中第 1 列的句柄执行计算,以测量计算的成本(存储在 col4 中,时间戳存储在 col5 中)。然后它检查是否有足够的空间来存储结果。如果是,它会存储数据,否则它会检查大小,以及数据被访问的次数与重新生成所需的时间的乘积,以决定剔除什么。

此外,还有一个'add'属性,它向元胞数组添加一行,创建一个与函数句柄同名的动态属性(使用addprops),并将get-method设置为@ 987654324@。如果您需要将参数传递给函数,您可以使用 set 方法创建一个附加属性myDynamicPropertyName_parameters,该方法将在参数更改值时删除先前计算的数据。

最后,您可以添加一些依赖属性,这些属性可以说明有多少属性(元胞数组中的行数)、它们的调用方式(元胞数组的第一个列)等。

【讨论】:

  • 我对基于成本和实用性删除旧缓存对象的逻辑更感兴趣。关于拥有 get 和 set 方法的部分并不难。事实上,我认为我根本不应该提到这种语言。
【解决方案2】:

考虑使用 Java,因为 MATLAB 在它之上运行,并且可以访问它。如果您有可编组的值(整数、双精度、字符串、矩阵,但不是结构或元胞数组),这将起作用。

LRU 容器可用于 Java:

【讨论】:

  • 我们通常使用-nojvm选项运行,因为内存限制,所以Java不是一个选项。实际上,我根本不应该提到这种语言。指向首字母缩写词“LRU”的指针至少对我的 google-fu 很有帮助。
最近更新 更多