这两个问题的答案都是使用地图。有几个步骤可以做到这一点。
首先你需要一个函数来把你的bit_array成一个数字或一个字符串。例如,将[0 1 1 0 1 0]
转换为'011010'
。 (Matlab的仅支持标量或字符串键,这就是为什么需要这个步骤)。
定义地图对象
cachedRunMap = containers.Map; %See edit below for more on this
要检查是否一个特定的情况下,已运行,使用iskey
。
cachedRunMap.isKey('011010');
添加运行的结果,使用追加语法
cachedRunMap('011010') = [0 1 1 0 1]; %Or whatever your result is.
要检索缓存的结果,使用越来越语法
tmpResult = cachedRunMap.values({'011010'});
这应该有效地存储并检索值直到用完系统内存。
把这个在一起,现在你的代码应该是这样的:
%Hacky magic function to convert an array into a string of '0' and '1'
strFromBits = @(x) char((x(:)'~=0)+48); %'
%Initialize the map
cachedRunMap = containers.Map;
%Loop, computing and storing results as needed
for i=1:1000000000
%pick a bit array somehow
strKey = strFromBits(bit_array);
if cachedRunMap.isKey(strKey)
result = cachedRunMap(strKey);
else
result = complex_function(bit_array);
cachedRunMap(strKey) = reult;
end
%do something with result
end
如果你想有一个关键是不是字符串,需要在步骤2中的一些被宣布例子:
cachedRunMap = containers.Map('KeyType', 'char', 'ValueType', 'any');
cachedRunMap = containers.Map('KeyType', 'double', 'ValueType', 'any');
cachedRunMap = containers.Map('KeyType', 'uint64', 'ValueType', 'any');
cachedRunMap = containers.Map('KeyType', 'uint64', 'ValueType', 'double');
设置一个'char'
的KeyType
将地图设置为使用字符串作为科YS。所有其他类型都必须是标量。
关于你这规模达(根据您最近的评论)问题会话之间
保存数据:应该没有问题,保存此映射到* .MAT文件,到系统内存限制
清除旧数据:我不知道将LRU功能添加到此映射的直接方法。如果你能找到一个Java实现,你可以很容易地在Matlab中使用它。否则,需要考虑一些问题以确定最后一次使用密钥的最有效方法。
在并发会话之间共享数据:如您所述,这可能需要数据库有效执行。数据库表格将是两列(如果您想实现LRU功能,则为3列),键值,(如果需要,最后使用时间)。如果你的“结果”不是一个容易适合SQL的类型(例如一个不规则大小的数组或者复杂的结构),那么你将需要考虑如何存储它。您还需要一种访问数据库的方法(例如数据库工具箱或Mathworks文件交换中的各种工具)。最后,你需要在服务器上设置一个数据库(例如MySql,如果你像我一样便宜,或者你有最多的经验,或者可以找到最多的帮助。)这实际上并不难,但它第一次需要花费一点时间和精力。
另一种考虑的方法(效率低得多,但不需要数据库)可能会将数据存储分解成大量(例如1000或数百万)地图。使用基于该映射中包含的键的文件名(例如,字符串键的前N个字符)将每个文件保存到单独的* .mat文件中,然后根据需要在会话之间加载/保存这些文件。这将非常缓慢......根据您的使用情况,每次从源函数重新计算可能会更快......但这是我可以在不设置数据库的情况下想到的最好方式(显然是更好的答案)。
你如何在内存中存储bit_array和bit_matrix?作为“逻辑”?或者打包到其他数据类型? (每个“逻辑”值实际上存储在一个字节中,而不是一位,即使它只能取两个可能的值。) – 2012-02-14 22:51:30
并且关于bit_array总共有多少不同的值?是否足够重叠,以至于可能将所有这些数据及其结果存储在内存中?或者将他们中的一些需要卸载到磁盘?单个仿真中的仿真周期是否存在重叠,或只是跨越不同的仿真?在模拟中bit_arrays的完成顺序是否存在局部性(例如,通常只有一些低阶位发生了变化)? – 2012-02-14 22:59:37
我没有声明任何东西,所以我想我正在使用普通的int32? – yoavram 2012-02-15 07:45:32