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

21 visualizzazioni (ultimi 30 giorni)
gafakel
gafakel il 2 Dic 2022
Commentato: gafakel il 3 Dic 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 Commento
gafakel
gafakel il 2 Dic 2022
「稀に」なのでそこまで困っているわけではないのですが、幸運にもヘルプに記載があったため、この辺りを参考に他の対策も考えてみます。

Accedi per commentare.

Risposta accettata

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

Accedi per commentare.

Più risposte (0)

Categorie

Scopri di più su ループと条件付きステートメント in Help Center e File Exchange

Prodotti


Release

R2022a

Community Treasure Hunt

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

Start Hunting!