「稀に」なのでそこまで困っているわけではないのですが、幸運にもヘルプに記載があったため、この辺りを参考に他の対策も考えてみます。
ワークスペースの工夫によるメモリ不足エラーの解消について
25 views (last 30 days)
Show older comments
お世話になっております。いつも数値シミュレーションに使わせていただいているのですが、稀に「メモリ不足エラー」が起きてエラー終了することがあります(大概の場合、とても長い・大規模な時間でやろうとした場合です)。
ここで、「ワークスペースを工夫して、実行中に使用するメモリを削減するのも1つの方法なのか?」と考えました。現在は特にローカル関数を使用せず、すべてのデータをベースワークスペースに入れています。例えば以下のような場合です。
%%%%% example of current program %%%%%
a=magic(3); % original data [1]
b=a.*a; % caliculate
c=b-1; % variable [1] which I want to use.
p=magic(4); % original data [2]
q=p.*p; % caliculate
r=q-1; % variable [2] which I want to use.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ここで、上記の変数b,qは以降のプログラムに関係しないため、別にベースワークスペースにはなくていいものなのです。そこで、cを求める計算だけを別の関数に移し、その関数のワークスペースに置くことを考えました。例えば以下のようにfOriginを作ってみる、という形です。
%%%%% example of novel program %%%%%
a1=magic(3); % original data [1]
c1=fOrigin(a1); % variable [1] which I want to use by original function
p1=magic(4);
r1=fOrigin(p1);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function ansVal=fOrigin(inpVal)
b1=inpVal.*inpVal; % caliculate
ansVal=b1-1;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
このとき、新しい方はベースワークスペースにa1,d1,p1,r1しか変数がないため、プログラムの実行中に使用するメモリの量が少なくて済むのかな、と考えました。ただ、結局使用する変数の数はほぼ同じであるため(上記ではb,qの2個が1個分で済んでいるだけ)、そこまで変わらないのかなとも考えています。
検証をどのようにしたらよいか見当がつかなかったため、質問をさせていただきました。また、「メモリ」についても理解不足があるかもしれません、申し訳ありません。
よろしくお願いいたします。
Accepted Answer
Atsushi Ueno
on 3 Dec 2022
>「ワークスペースを工夫して、実行中に使用するメモリを削減するのも1つの方法なのか?」
その通りです。メモリ不足エラーの解決にも、考えられる解決策の一つに clear で不要な変数のクリアを行う方法が述べられています。不要な変数をクリア(メモリ開放)すれば、不必要なメモリ消費でメモリ不足に陥る心配はなくなります。
関数ワークスペースのローカル変数は、persistent で宣言された永続変数でなければ当該関数の実行後クリア(メモリ開放)されます。だから変数b,qに相当するb1の分だけメモリを消費せずに済みます。
(関数呼び出しに掛かるスタックメモリなどの話は無視します)
>検証をどのようにしたらよいか見当がつかなかった
プログラム中の要所要所で whos 関数を実行し、変数に割り当てられたメモリを把握すると良いと思います。関数内を実行中に表示するのは関数ワークスペースの変数のみで、当該関数を出た後はベースワークスペースに移ります。
S = whos;
struct2table(S) % whos の内容を表示してみる
sum([S.bytes]) % 現在のワークスペースに確保された変数の合計バイト数を返す
More Answers (0)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!