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

조회 수: 25 (최근 30일)
gafakel
gafakel 2022년 12월 2일
댓글: gafakel 2022년 12월 3일
お世話になっております。いつも数値シミュレーションに使わせていただいているのですが、稀に「メモリ不足エラー」が起きてエラー終了することがあります(大概の場合、とても長い・大規模な時間でやろうとした場合です)。
ここで、「ワークスペースを工夫して、実行中に使用するメモリを削減するのも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
gafakel
gafakel 2022년 12월 2일
「稀に」なのでそこまで困っているわけではないのですが、幸運にもヘルプに記載があったため、この辺りを参考に他の対策も考えてみます。

댓글을 달려면 로그인하십시오.

채택된 답변

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

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Logical에 대해 자세히 알아보기

제품


릴리스

R2022a

Community Treasure Hunt

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

Start Hunting!