缓存机制

计算科学 matlab 软件 编程范式
2021-12-16 15:06:54

我在设计有效的缓存机制时遇到了问题。该机制将用作开发科学软件的项目的一部分。

目标是通过加载过去完成的相同计算的结果来节省计算时间。

我遇到的问题是如何知道计算是否与前一个相同。在大多数情况下,检查输入参数就足够了,但有时代码会发生变化,然后即使输入参数可以相同,结果也可能会有所不同。

问题是现在修改代码需要与清除缓存相结合,以防代码创建缓存结果。这是一个容易出错的手动步骤。失败可能导致结果保持不变,即使在代码更改之后,也会导致错误或错误的结论。

我想知道是否有任何缓存机制可以解决,或者以某种方式帮助避免这个陷阱。

谢谢, 奥弗

2个回答

答案部分取决于您正在寻找的解决方案的稳健性以及您使用的开发工作流程类型。

一个特别简单的选项是用软件的版本号标记每个缓存条目。只要对代码的每次更改都伴随着版本号的更改,这将为您提供一种简单的方法来检查缓存文件是否仍然有效。但是,版本编号可能仅适用于对项目的更改一次全部提交的情况。

一个不太健壮但更适合持续开发的选项是简单地比较 [最旧] 缓存文件和源文件的最后修改日期。如果源文件在所有缓存文件之前最后一次修改,则后者应该仍然可用。


@DeerHunter 指出了一种比上述任何一个选项都更强大的技术,并且无论您的开发方法如何,都应该可以工作。

创建缓存文件时,包括当前源代码的哈希。在程序执行开始时,对当前源代码进行哈希处理,并将结果与​​每个缓存文件中包含的哈希值进行比较。如果它们不匹配,则该文件是由不同版本的软件生成的,应该被删除。

类似的过程可以加快输入参数之间的比较。在每个缓存文件中存储输入参数的散列,然后将该散列与当前输入参数的散列进行比较以检查匹配。这里唯一的缺点是您不能再查找输入参数接近当前模拟的缓存文件。

我有一个满足您指定兴趣的 Python 实现。看一下它,以了解一种使用能够自省的语言执行此操作的简单方法。

您用它装饰的任何功能都将运行一次,并将结果缓存在本地。随后的调用:

  1. 相同的论点
  2. 相同的功能码

将从磁盘加载。

如果结果是一个数组以更快地保存和加载,它会使用不同的存储机制。

这将是一堆更难用 c/c++ 和类似的东西编写。尽管一个简单的技巧可能是使用诸如TIMEDATE之类的预处理器指令对哈希进行加盐处理,如果您想在重新编译后丢弃缓存的结果时犯错的话。