【问题标题】:How can I make a saving code faster? -MatLab如何更快地保存代码? -MatLab
【发布时间】: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 中的所有文件将被重复加载和保存。还有一些其他问题(不需要strcatsprintf),但这是我认为合乎逻辑的问题。
  • 要完成 Justin 的思路,您可以将 mmm 循环移到代码末尾,在其他循环之外,或者您可以完全摆脱 mmm 循环对当前 (mm) 文件名进行操作。您可能可以通过使用递归目录搜索 dir( '\\storage-2\...\Raw\DAQ5\**\*.mat' ) 来通过单个 dir 调用查找所有嵌套的 mat 文件来进一步减少循环(这取决于 MATLAB 版本,但已经存在了几年)
  • 在 Matlab Profiler 中运行您的代码,以确定它实际花费的时间,以及您应该将改进工作集中在哪里! mathworks.com/help/matlab/matlab_prog/…

标签: matlab optimization


【解决方案1】:

Matlab load 函数采用可选的附加参数来指定仅从输入文件中读取的选定变量。

s = load('path/to/file.mat', 'Ch_1_y');

这样您就不必花时间从那些您将立即丢弃的输入.mat 文件中加载所有其他变量。

使用save 通过 SMB 共享保存 MAT 文件可能会很慢。您可能想先调用save 将其写入临时本地文件,然后将完成的文件复制到最终目的地。听起来像更多的 I/O,但它实际上可以是一个净赢,这取决于您的特定系统和网络。衡量它的两种方式,看看它是否在你的特定情况下是一个胜利。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多