【发布时间】:2022-02-06 08:58:10
【问题描述】:
我正在运行一个简短的代码来逐个打开文件列表并仅保存文件中包含的变量之一。在我看来,这个过程比我预期的要慢得多,并且随着时间的推移越来越慢,我不完全理解为什么以及如何让它运行得更快。我总是在优化中挣扎。如果您有建议,我将不胜感激。
代码如下(以...代替实际路径为例):
main_dir=dir(strcat('\\storage2-...\Raw\DAQ5\'));
filename={};
for m=7:size(main_dir,1)
m
second_dir=dir([main_dir(m).folder '\' main_dir(m).name '\*.mat']);
for mm=1:numel(second_dir)
filename{end+1}=[second_dir(mm).folder '\' second_dir(mm).name];
for mmm=1:numel(filename)
namefile=sprintf(second_dir(mm,1).name);
load(string(filename(1,mmm)));
save(['\\storage2-...\DAQ5\Ch1_',namefile(end-18:end-4),'.mat'], 'Ch_1_y')
end
end
end
原始文件约为 17 MB,保存单个变量后,大小约为 6 MB。
【问题讨论】:
-
对于添加到
filename的每个目录,但随后在最内层循环 (mmm) 中开始循环所有文件名,而不仅仅是最近的文件名。所以第一次读取 dir1 中的所有文件,第二次读取 dir1 & dir 2 中的文件,第三次读取 dir1 & dir2 & dir3 中的所有文件,依此类推,所以 dir1 中的所有文件将被重复加载和保存。还有一些其他问题(不需要strcat和sprintf),但这是我认为合乎逻辑的问题。 -
要完成 Justin 的思路,您可以将
mmm循环移到代码末尾,在其他循环之外,或者您可以完全摆脱mmm循环对当前 (mm) 文件名进行操作。您可能可以通过使用递归目录搜索dir( '\\storage-2\...\Raw\DAQ5\**\*.mat' )来通过单个dir调用查找所有嵌套的 mat 文件来进一步减少循环(这取决于 MATLAB 版本,但已经存在了几年) -
在 Matlab Profiler 中运行您的代码,以确定它实际花费的时间,以及您应该将改进工作集中在哪里! mathworks.com/help/matlab/matlab_prog/…
标签: matlab optimization