这是一个通用算法问题,但我的主要环境是Matlab。
我有一个功能
out = f(arg1,arg2 ,, .....)
需要很长时间才能执行,并且计算成本很高(即群集时间)。给定的参数argn可以是字符串,整数,向量,甚至是函数句柄
出于这个原因,我想避免为相同的参数值调用f(args)。在我的程序中,这可能以程序员无法控制的方式发生。
所以,我想为args的每个可能值调用一次f(),并将结果保存到磁盘。然后,每当下次调用它时,检查当前是否存在这些参数值的结果。如果是这样,我会从磁盘加载它。
我目前的想法是创建一个单元格变量,每个函数调用都有一行。在第一栏出来了。在第2列中:N是argn的值,并分别检查每个的等价性。
由于参数的变量类型各不相同,我将如何进行此操作?
有更好的算法吗?
更一般地说,人们如何处理将模拟结果保存到磁盘并存储元数据? (除了把所有东西塞进文件名之外!)
答案 0 :(得分:1)
您可以实现如下所示的函数:
function result = myfun(input)
persistent cache
if isempty(cache)
cachedInputs = [];
cachedOutputs = [];
cache = {cachedInputs, cachedOutputs};
end
[isCached, idx] = ismember(input, cache{1});
if isCached
result = cache{2}(idx);
else
result = doHardThingOnCluster(input);
cache{1}(end+1) = input;
cache{2}(end+1) = result;
end
这个简单的例子假设您的输入和输出都是可以存储在数组中的标量数。如果你必须处理字符串,或者更复杂的东西,你可以使用单元格数组进行缓存而不是数组。或者事实上,也许containers.Map
可能更好。或者,如果您必须缓存非常大量的结果,最好将其保存到文件并缓存文件名,然后在发现文件被缓存时加载文件。
希望有所帮助!