为什么保存到名为temp的文件夹导致数据加载在Matlab中的for循环中减慢?

LaW*_*aWa 9 file-io matlab

重要更新

我刚刚发现,在重新启动Matlab和计算机后,这个简化的代码不再为我重现问题......我很抱歉花时间使用不起作用的脚本.但是,如果我在内部'for'循环中的任何文件夹(我已经尝试过)中保存了任何内容,那么旧问题仍然存在于我的原始脚本中.就我的目的而言,除非我绝对需要,否则我只是不做这个保存.原来的剧本在的方面如下结构for的循环和使用saveload:

load() % .mat files, size 365x92x240
for day = 1:365
    load() % .mat files, size 8x92x240

    for type = 1:17
        load() % .mat files size 17x92x240
        load() % .mat files size 92x240

        for step 1:8
            %only calculations
        end
        save() % .mat files size 8x92x240

    end 
    save() % .mat files, size 8x92x240
end

% the load and saves outside the are in for loops too, but do not seem to affect the described behavior in the above script
load() % .mat files size 8x92x240
save() % .mat files size 2920x92x240
load() 
save() % .mat files size 365x92x240
load()
save() % .mat files size 12x92x240
Run Code Online (Sandbox Code Playgroud)

如果完整运行,脚本将保存约.10 Gb和负载约.2Gb的数据.

整个脚本相当冗长,可以进行大量的保存和加载.不幸的是,在我设法以简化版本重现问题之前,分享所有内容是相当不切实际的.正如我令人沮丧地发现,相同的代码可能会不时地表现不同,它会立即变得比预期更乏味,以找到一致地再现行为的简化.一旦我确定产生问题的可管理代码,我就会回来.


以前的问题描述(注意:下面的代码不能确保重现所描述的问题.):

我刚刚学到了很难的方法,在Matlab中,你不能在循环中将保存文件夹命名为temp,for而不会在下一轮循环中减慢数据加载速度.我的问题是为什么?

如果您有兴趣自己重现问题,请参阅下面的代码.要运行它,您还需要一个名为anyData.mat的matfile来加载和两个用于保存的文件夹,一个名为temp,另一个名为temporary.

clear all;clc;close all;profile off;
profile on

tT= zeros(1,endDay+1);
tTD= zeros(1,endDay+1);

for day = 0:2;
    tic
    T = importdata('anyData.mat')
    tT(day+1)=toc; %loading time in seconds

    tic
    TD = importdata('anyData.mat')
    tTD(day+1)=toc;

    for type = 0:1
        saveFile = ones(92,240);

        save('AnyFolder\temporary\saveFile.mat', 'saveFile') % leads to fast data loading 
        %save('AnyFolder\temp\saveFile.mat', 'saveFile') %leads to slow data loading

    end % end of type 

end% end of day

profile off
profile report

plot(tT)
Run Code Online (Sandbox Code Playgroud)

您将在图表的y轴上看到,当您在后面的for循环中保存到临时而不是临时时,数据加载会花费更长的时间.那里有谁知道为什么会这样?

Far*_*ani 0

这里有两件事

  1. for 循环期间的存储是一项昂贵的操作,因为它通常会打开一个文件流并在继续之前关闭它。您可能无法避免这一点。
  2. 第二件事是存储速度及其缓存速度。最有可能的程序使用临时文件夹作为自己的临时文件,并有一个垃圾收集器或软件来管理这些文件以清理它们。如果您开始打开和关闭此文件夹的文件流,则必须发送请求以获得对该文件夹的独占写入访问权限。这又增加了时间。

如果您正在进行图像处理操作并且有多个图像,则由于 MATLAB 可用的速度、缓存和当前内存,写入硬盘可能会遇到瓶颈。