重要な更新
Matlab とコンピューターを再起動した後、この単純化されたコードでも問題が再現されなくなったことを発見しました...動作しないスクリプトで時間を費やして申し訳ありません。ただし、内側の 'for' ループで (私が試した) 任意のフォルダーに何かを保存すると、元のスクリプトに古い問題が残ります。私の目的のために、絶対に必要でない限り、この保存を行わないことで回避しました. 元のスクリプトは、for
ループとsave
orの使用に関して次の構造を持っています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 軸に表示されます。なぜこれが起こるのか知っている人はいますか?