10

重要更新

我刚刚发现在重新启动 Matlab 和计算机后,这个简化的代码也不再为我重现问题......我很抱歉占用你的时间来处理一个不起作用的脚本。但是,如果我在内部“for”循环中的任何文件夹(我尝试过)中保存任何内容,旧问题仍然存在于我的原始脚本中。出于我的目的,我已经解决了这个问题,除非我绝对需要它,否则根本不进行保存。for原始脚本在循环和使用saveor方面具有以下结构load

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

如果完全运行,脚本将节省大约。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)

您将在绘图的 y 轴上看到,当您在稍后的for循环中保存到temp而不是临时时,数据加载需要更长的时间。有没有人知道为什么会发生这种情况?

4

2 回答 2

0

这里有两件事

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

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

于 2013-01-29T05:07:28.603 回答
0

我无法重现该问题,怀疑它是特定于系统和数据大小的。但是一些可以帮助您摆脱困境的一般性评论:

正如评论者和上述答案所指出的那样,双 for 循环中的文件 i/o 可能是非常寄生的,特别是在您只需要访问文件中的部分数据,而其他系统操作会延迟该过程的情况下,或者数据文件足够大,甚至需要虚拟内存(Windows)/交换空间(Linux)来加载它们。在后一种情况下,您可能会在打开文件时将文件从硬盘的一部分移动到另一部分!

我假设您正在加载/保存,因为您没有 c.10GB 的内存来将所有内容保存在内存中进行计算。实际问题没有描述,所以我不能确定,但​​认为您可能会发现matfile该类很有用...... TMW 文档。这用于直接映射到 mat 文件/从 mat 文件映射。这个:

  • 降低文件流打开和关闭 IOPS

  • 允许任意大的可变大小(由磁盘大小控制,而不是内存)

  • 允许您部分读取/写入(即只写入数组的某些元素而不加载整个文件)

  • 如果您的 mat 文件太大而无法保存在内存中,请避免将其加载到非常麻烦的交换空间中。

希望这可以帮助。

汤姆

于 2016-07-06T20:30:51.663 回答