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 と、保存する 2 つのフォルダー (1 つはtemp、もう 1 つは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)

for後のループで一時的ではなく一時に保存すると、データの読み込みにかなり長い時間がかかることがプロットの y 軸に表示されます。なぜこれが起こるのか知っている人はいますか?

4

2 に答える 2

0

ここには2つのことがあります

  1. for ループ中のストレージは、通常、ファイル ストリームを開き、次に移動する前に閉じるため、負荷の高い操作です。これを回避できない場合があります。
  2. 2 つ目は、ストレージの速度とそのキャッシュ速度です。ほとんどの場合、プログラムは独自の一時ファイルに temp フォルダーを使用し、ガベージ コレクターまたはソフトウェアを使用してこれらをクリーンアップします。このフォルダーへのファイル ストリームの開閉を開始する場合は、フォルダーへの排他的な書き込みアクセスを取得するための要求を送信する必要があります。これでまた時間が増えます。

画像処理操作を行っていて、複数の画像がある場合、MATLAB で使用できる速度、キャッシュ、および現在のメモリが原因で、ハード ドライブへの書き込みでボトルネックが発生する可能性があります。

于 2013-01-29T05:07:28.603 に答える