4

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

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

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

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

当你达到内存限制并且它必须根据它们的内存占用、它们的成本和它们的有用性来剔除一些对象时,它的真正胆量将是在“放置”操作中。我怎么做?

抱歉,如果这太模糊或偏离主题。

4

2 回答 2

2

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

这是基本的设计理念:

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

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

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

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

于 2011-02-17T02:15:12.393 回答
1

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

LRU 容器可用于 Java:

于 2011-02-17T13:18:08.297 回答