因为最近算法实现过程中,随着算法变得复杂,运行中不必要部分耗时逐渐增加。通常来说,为了节约调试时间,会把已经运行正确的结果存储下来(指定文件夹),然后再运行程序时便可以直接读取中间项本地文件,大大节约不必要的重复计算时间。这里只对我最近比较常用的存储文件和读取的方法进行介绍,当然欢迎大家一起讨论新的方法。
首先,要弄清转储和读取的算法流程。
(1)加载本地指定文件名filename的文件file;
(2)如果加载失败(file为空),则跳转(3)否则跳转(4);
(3)计算生成指定file,并转储到本地指定路径filename;
(4)进入算法的下一步。
Matlab大致代码如下:
% Load file (or compute if fileis not found)
file = loadFile( options, shot );
if( isempty( file ) )
file = computeFile( options, shot );
end
其中loadFile函数的传参options记录存储路径和方法,shot记录当前处理文件的id,可用于处理多个同类计算问题的中间项存储。computeFile函数的传参同loadFile。
loadFile函数具体代码如下。其中比较技巧性的地方在于fullfile函数的使用,根据传参则可找到指定文件夹outfolder,子文件夹名为file,计算方法命名子子文件夹,最后找到当前文件。
function result = loadFile(options, range )
% file是文件的完全路径,options.outfolder是输出数据文件的文件夹路径,字符串格式;
% options.method是当前部分的算法名称,字符串格式;
% fileShot%i.mat是中间项的文件名
file = fullfile( options.outfolder, 'file',...
options.method, sprintf('fileShot%i.mat', range ) );
% 如果本地文件已存在,则直接加载load,没有则返回为空
if( exist( file, 'file' ) )
flow = load( file );
if( isfield( flow, 'input' ) )
result = flow.input;
elseif( isfield( flow, 'flow' ) )
result = flow.flow;
else
warning( '%s: no known fieldfound\n', file );
result = [];
end
else
warning( '%s not found\n', file );
result = [];
end
end
运行了loadFile函数之后,如果file还为空则说明本地不包含该中间项文件,则调用computeFile函数进行计算。
function file = computeFile(options, shot )
filefolder = fullfile( options.outfolder, 'file',...
options.method );
if( ~exist(filefolder, 'dir' ) )
mkdir( filefolder );
end
filename = fullfile( filefolder,...
sprintf( 'fileShot%i.mat', shot ) );
if( strcmp( options.filemethod, '自己的计算方法' ) )
file = computeFileMethod( ); % 自己的计算方法
else
error( 'Unknown file computationmethod' )
end
% 得到计算结果之后,保存在指定文件夹
save( filename, 'file', '-v7.3' );
end
以上就是比较耗时的算法过程中,对中间项进行文件存储并且读取的大致方法,最近用的很频繁的一段代码,也是从别处借鉴总结过来的,希望能给大家一些帮助!