「稀に」なのでそこまで困っているわけではないのですが、幸運にもヘルプに記載があったため、この辺りを参考に他の対策も考えてみます。
ワークスペースの工夫によるメモリ不足エラーの解消について
25 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
お世話になっております。いつも数値シミュレーションに使わせていただいているのですが、稀に「メモリ不足エラー」が起きてエラー終了することがあります(大概の場合、とても長い・大規模な時間でやろうとした場合です)。
ここで、「ワークスペースを工夫して、実行中に使用するメモリを削減するのも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個分で済んでいるだけ)、そこまで変わらないのかなとも考えています。
検証をどのようにしたらよいか見当がつかなかったため、質問をさせていただきました。また、「メモリ」についても理解不足があるかもしれません、申し訳ありません。
よろしくお願いいたします。
Réponse acceptée
Atsushi Ueno
le 3 Déc 2022
>「ワークスペースを工夫して、実行中に使用するメモリを削減するのも1つの方法なのか?」
その通りです。メモリ不足エラーの解決にも、考えられる解決策の一つに clear で不要な変数のクリアを行う方法が述べられています。不要な変数をクリア(メモリ開放)すれば、不必要なメモリ消費でメモリ不足に陥る心配はなくなります。
関数ワークスペースのローカル変数は、persistent で宣言された永続変数でなければ当該関数の実行後クリア(メモリ開放)されます。だから変数b,qに相当するb1の分だけメモリを消費せずに済みます。
(関数呼び出しに掛かるスタックメモリなどの話は無視します)
>検証をどのようにしたらよいか見当がつかなかった
プログラム中の要所要所で whos 関数を実行し、変数に割り当てられたメモリを把握すると良いと思います。関数内を実行中に表示するのは関数ワークスペースの変数のみで、当該関数を出た後はベースワークスペースに移ります。
S = whos;
struct2table(S) % whos の内容を表示してみる
sum([S.bytes]) % 現在のワークスペースに確保された変数の合計バイト数を返す
Plus de réponses (0)
Voir également
Catégories
En savoir plus sur Logical dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!