这段时间做一个大数据量的仿真,发现经常出现out of memory 的问题,上网搜索了很多办法,如扩大虚拟内存,使用3Gb开关,优化算法流程,使用pack,save, clear函数等。详见http://hi.baidu.com/zwwcqu/blog/item/2ee2261ef7b9eecfa6866943.html 和http://hi.baidu.com/zwwcqu/blog/item/e3b34235c8560f49241f1474.html
但使用后效果均不理想,数据量一旦增加,马上要出现out of memory的问题。后来把程序相关算法优化了一遍,尤其是针对循环嵌套,把没必要的变量clear掉了,把有用的变量先save,后clear掉,最后终于得出较好的结果。
下面介绍一下关于clear、save、load的特殊用法,这对在for或while等多重循环里出现out of memory非常有效。
for k = 1:N % N为循环次数 % ---------------------
var0 = k; % 获得变量var0 %----------------------
string = [sprintf('var_%d', k) ' = var0;' ]; eval(string); % 等价于 var_k = var0; save(sprintf('var_%d.mat', k), sprintf('var_%d')); % 等价于 save var_k.mat var_k
clear(sprintf('var_%d')); % 等价于 clear var_kend 如果要读取刚才存取的变量var_k, (k = 1,2, ..., N).
那么,可以使用如下用法
for k = 1:N
load(sprintf('var_%d.mat', k)); % 等价于 load var_k.mat k = 1,2, ..., N
end
另外,还有一些非常有用的用法。如果用清除刚才读取的变量var_k, k = 1, 2, ..., Nclear '-regexp' '^var_' % 清除所有以“ var_ ”开头的变量还有很多关于save、clear、load等用法,具体help一下。
没有评论:
发表评论