6

4 つの変数があり、それぞれが 365 個のマット ファイル (サイズ: 8 x 92 x 240) に保存されています。これらを for-loop 日 = 1:365、1 日あたり 1 つの変数ファイルで関数にロードしようとしています。ただし、最初の 2 つの変数は常に読み込みに異常に長い時間がかかります。ロードするための私のコードは次のようになります。

load([eraFolder sprintf('Y%dD%d-tempSD.mat',year,day)], 'tempSD'); % took 5420 s to load

load([eraFolder sprintf('Y%dD%d-tempDewSD.mat',year,day)], 'tempDewSD') 

load([eraFolder sprintf('Y%dD%d-eEraSD.mat',year,day)], 'eEraSD'); % took 6 seconds to load

load([eraFolder sprintf('Y%dD%d-pEraSD.mat',year,day)], 'pEraSD'); 

Profiler を使用すると、365 回の呼び出しで最初の 2 つの変数を読み込むのに 5420 秒かかったのに対し、最後の 2 つの変数を 365 回の呼び出しで読み込むのにそれぞれ 6 秒と 4 秒かかったことがわかりました。変数がロードされる順序を入れ替えた場合、たとえばのeEraSD前にtempSD、まだ時間がかかるのは最初の 2 つのロードです。

を使用tic tocしてロードに費やされた時間を追跡すると、最初または 2 番目の変数をロードする時間が、呼び出しの数に応じて指数関数的に増加するように見えます (最後の呼び出しの実行には 50 秒かかります)。3 番目と 4 番目の変数の場合、読み込み時間はファイルあたり約 0.02 ~ 0.04 秒にとどまり、for ループのどこまで進んだかにはほぼ依存しません。以下の図を参照してください。

ここに画像の説明を入力 ここに画像の説明を入力

'load' の代わりに使用importdataすると、最初の行は 365 回ロードするのに約 8000 秒かかります (2 番目の図の T で示されているように、ロードは指数関数的に増加します)。他の行は、365 回ロードするのに約 10 秒かかります。

なぜこのように見えるのか、読み込み時間を短縮するために何ができるのか理解できません。これに対する可能な解決策のアイデアをいただければ幸いです。

4

2 に答える 2

2

あなたのデータセットは同じディレクトリ (ネットワーク経由またはローカル) にあり、同じ属性 (アクセス プロパティなど) を持っていると思います。

残っている唯一のオプションは、それらの matfile に格納されている vairbales の特性を使用することです。サンプルをロードするなどして、これらの変数のサイズを確認できますか。これにより、問題を解決するために絞り込まれます。

その助けを願っています。

FS

于 2012-12-17T22:07:36.947 に答える
1

ご協力いただきありがとうございます。私はついに問題の原因を突き止めました。スクリプトの後半の「for」ループで、temp という名前のフォルダーに他のデータを保存しました。そのフォルダーの名前を別のもの (一時的なものなど) に変更した後、データの読み込みの問題はなくなりました。

(実用的な問題が解決された今ではそれほど重要ではありませんが、後の「save」呼び出しとこの「importdata」または「load」呼び出しの間にこの奇妙な関係があった理由を理解しているとは言えません。)

tempフォルダに関する新しい質問を参照してください

于 2013-01-14T17:52:02.970 に答える