ワークスペースの工夫​によるメモリ不足エラ​ーの解消について

21 views (last 30 days)
gafakel
gafakel on 2 Dec 2022
Commented: gafakel on 3 Dec 2022
お世話になっております。いつも数値シミュレーションに使わせていただいているのですが、稀に「メモリ不足エラー」が起きてエラー終了することがあります(大概の場合、とても長い・大規模な時間でやろうとした場合です)。
ここで、「ワークスペースを工夫して、実行中に使用するメモリを削減するのも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個分で済んでいるだけ)、そこまで変わらないのかなとも考えています。
検証をどのようにしたらよいか見当がつかなかったため、質問をさせていただきました。また、「メモリ」についても理解不足があるかもしれません、申し訳ありません。
よろしくお願いいたします。
  1 Comment
gafakel
gafakel on 2 Dec 2022
「稀に」なのでそこまで困っているわけではないのですが、幸運にもヘルプに記載があったため、この辺りを参考に他の対策も考えてみます。

Sign in to comment.

Accepted Answer

Atsushi Ueno
Atsushi Ueno on 3 Dec 2022
>「ワークスペースを工夫して、実行中に使用するメモリを削減するのも1つの方法なのか?」
その通りです。メモリ不足エラーの解決にも、考えられる解決策の一つに clear で不要な変数のクリアを行う方法が述べられています。不要な変数をクリア(メモリ開放)すれば、不必要なメモリ消費でメモリ不足に陥る心配はなくなります。
関数ワークスペースのローカル変数は、persistent で宣言された永続変数でなければ当該関数の実行後クリア(メモリ開放)されます。だから変数b,qに相当するb1の分だけメモリを消費せずに済みます。
(関数呼び出しに掛かるスタックメモリなどの話は無視します)
>検証をどのようにしたらよいか見当がつかなかった
プログラム中の要所要所で whos 関数を実行し、変数に割り当てられたメモリを把握すると良いと思います。関数内を実行中に表示するのは関数ワークスペースの変数のみで、当該関数を出た後はベースワークスペースに移ります。
S = whos;
struct2table(S) % whos の内容を表示してみる
sum([S.bytes]) % 現在のワークスペースに確保された変数の合計バイト数を返す
  1 Comment
gafakel
gafakel on 3 Dec 2022
ご回答いただきありがとうございます。方針があっていて安心しました(URLにclearが載っていることは見落としていました)。
どうしても関数化したりclearを使ったりするとシミュレーションに時間がかかる印象ではあるのですが、かといってメモリ不足を無視もできないため、いい具合のバランスでやってみます。
また、whosの使い方もご教示いただきありがとうございます。漫然とコマンドウィンドウでは使っていたりしたのですが、このようにstruct2tableと組み合わせてバイト数が出せるのは思いつきませんでした。参考になります。

Sign in to comment.

More Answers (0)

Categories

Find more on ループと条件付きステートメント in Help Center and File Exchange

Products


Release

R2022a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!