Programming and Data Types | ![]() ![]() |
メモリ使用に関する注意
この節は、メモリを保護したり、メモリの使い方を改良する方法を議論します。
メモリ管理関数
MATLABは、メモリの取り扱いを行なう5つの関数を用意しています。
clear
は、メモリから変数を取り除きます。pack
は、存在している変数をディスクにセーブし、これらを一つのまとまったものとして再ロードします。時間を必要とするため、ループや、または、M-ファイル関数の中では、pack
を使わないでください。quit
は、MATLABを終了し、すべての割り当てられているメモリをシステムに戻します。save
は、選択した変数をディスクにセーブします。load
は、save
コマンドを使ってセーブしたデータファイルを再ロードします。いくつかのシステムにおいて、whos
コマンドは、残っているフリーメモリの総量を表示します。しかし、つぎのことは、知っておいてください。
whos
により示されるフリーメモリの総量は、削除される変数が最も大きいメモリアドレスを占めていない限り変化しません。実際に、数字は、一塊の使っていないメモリの量を示しています。最も大きい部分を消去することは、フリーメモリを大きくしますが、最も大きい部分を占める部分の周りの変数を消去することは、なにも影響を与えません。このことは、ユーザは、実際にwhos
により示されるものよりも多くのフリーメモリをもっていることを意味しています。メモリから関数の削除
MATLABは、起動時に、matlab/toolbox
ディレクトリの下に位置するすべてのファイルに対するM-ファイルとMEX-ファイルの一覧表を作成します。この表は、メモリにストアされ、関数path
で読み込まれ新しい一覧表が作成されるときのみに書き換えられます。ファンクション
M-ファイルコードとMEX-ファイルで再設定されたコードは、対応する関数が読み込まれたとき、メモリにロードされます。M-ファイルコード、または、再割り当てされるコードは、つぎの場合にメモリから削除されます。
clear
コマンドで完全にクリアされる。入れ子になった関数の読み込み
入れ子になった関数により使われるメモリの総量は、それらを連続的に読み込んで使うメモリの総量と同じです。つぎの二つの例題は、同じメモリを必要としています。
result = function2(function1(input99)); result = function1(input99); result = function2(result);
変数とメモリ
メモリは、代入式の中の左辺変数がメモリ内に存在しないときは、いつでも変数に対して割り当てられます。ステートメント
x = 10
x(10) = 1
は、x
の10番目の要素が存在するなら、メモリの割り当ては行ないません。
clear variable_name
を使って、削除します。
変数とメモリ
メモリは、代入式の中の左辺変数がメモリ内に存在しないときは、いつでも変数に対して割り当てられます。ステートメント
x = 10
x(10) = 1
は、x
の10番目の要素が存在するなら、メモリの割り当ては行ないません。
y = fun(x,y)
clear variable_name
を使って、削除します。
グローバル変数 変数をglobal
として宣言することは、単にシンボルテーブルの中でフラグが付くだけです。これは、グローバル変数を定義しないものより多くのメモリを使うものではありません。つぎの例題を考えましょう。
global a a = 5;
さて、MATLABワークスペースの中にa
のコピーを一つストアしたものです。つぎのようにタイプインします。
clear a
は、MATLABワークスペースからa
を取り除きます。しかし、global
ワークスペースの中には、まだ存在しています。
clear global a
PC固有の事柄
UNIX固有の事柄
a = rand(1e6,1); b = rand(1e6,1);
つぎのものは、約16.4MBのRAMを必要とします。
c = rand(2.1e6,1);
そして、つぎのステートメントは、約32.4MBのRAMを必要とします。
a = rand(1e6,1); b = rand(1e6,1); clear c = rand(2.1e6,1);
これは、MATLABが2つの1MBの配列により前もって占められるスペースに2.1MBの配列をフィットすることができないためです。メモリのオーバアロケーションを妨げる最も簡単な方法は、最大ベクトルを前もって割り当てることです。つぎの一連のステートメントは、約32.4MBのRAMを使います。
a = rand(1e6,1); b = rand(1e6,1); clear c = rand(2.1e6,1);
一方、つぎのステートメントは、約16.4MBのRAMを使います。
c = rand(2.1e6,1); clear a = rand(1e6,1); b = rand(1e6,1);
まず、最長ベクトルを割り当てることは、利用可能なメモリの最適な使用を行なうことになります。
メモリアウトが意味するものは?
Out of Memory
メッセージは、MATLABがカレントで利用可能なものよりも多くのメモリをオペレーテングシステムに要求したために生じるものです。この節で議論されているいくつかの手法を使って、利用可能なメモリを最適化するようにしてください。Out
of Memory
メッセージが表示されたなら、
のいずれかを行なってください。
![]() |
配列を前もって割り当てる | キャラクタ配列(文字列) | ![]() |