メモリ管理
メモリ使用状況の参照
特にメモリ容量が記号計算における計算規模を決定する主要な要因になっている.計算が遅いと,そのまま長く計算させておくことができる.しかし,計算過程においてメモリに入り切らないほどの大きな中間結果が生成されると,計算を続けることは不可能になってしまう.
Mathematica はメモリをなるべく効率的に使うようにプログラムされている.計算で生成された中間結果が必要なくなったなら,その保管に使われていたメモリ領域はすぐに解放されるようになっている.つまり,セッションのどの時点においても実際に必要な式しか保管されない.後で「ゴミ収拾」しなければならないような,いらなくなったオブジェクトは手元には置かない.
Mathematica が使用中のメモリ量を調べる.
| Out[1]= |  |
|
| Out[2]= |  |
|
| Out[3]= |  |
|
リストは Out[2]に割り当てられた値として保管されている.したがって, Out[2]を消去するともとのリストが消える. |
| Out[5]= |  |
|
| Out[6]= |  |
|
特定のコンピュータにおいて,
Mathematica で使用可能なメモリ量はどう決まるのだろうか.コンピュータの実行している処理の数や量によらず,使えるメモリ量には限りがある.また,メモリの上限はオペレーティングシステムの種類や設定条件により変わる.設定によっては物理的に搭載してあるメモリ量に相当する.また,大容量記憶装置の空間の一部を仮想メモリとして使っている場合は,物理メモリ量より大きくなる.
Mathematica の実行にはデータとプログラムの両方を保持する空間が必要である.プログラムだけで数メガバイトの大きさなので,要求のあった計算に応じて必要なコード部だけが,通常,メモリに読み込まれる.あるデータを保管するのにメモリ量がどのくらい必要かを計算するなら,プログラム部の使う量も勘定に入れることを忘れないようにする.さらに,他のプログラムも同時に動作している場合は,使える容量はさらに減るだろう.別に実行しているプログラムが少なければ少ないほど計算に使える容量は普通増える.
計算にかかる時間も物理メモリ量に大きく依存する.つまり,搭載メモリが大きいほど時間が短くて済むようになる.仮想メモリを使うよう設定しておけば使えるメモリ量は増えるが,アクセスに要する時間が物理メモリの数百から数千倍かかってしまう.計算の規模が大きいため,どうしても仮想メモリを使わなければできない場合もあるが,そのようなときは余計に時間がかかってしまう.
メモリ使用量の制限
MemoryConstrainedを使ったメモリの制限設定は計算時間の制限で使う
TimeConstrainedの設定に似ている.指定した上限より大きなメモリの要求があると,評価処理が強制的に中止する.ただし,
TimeConstrainedでそうであるように,
MemoryConstrainedでも実際に中止する前に指定した上限量以上のメモリが使われてしまうこともある.
式の大きさ情報
ByteCountを使うと計算したい式がどの程度の大きさかが分かり便利である.ただし,式が同じでも,違う
Mathematica バージョンではメモリの使用量が変わるときもあるので,普遍的な値ではないということに注意が必要である.
また,
ByteCountの返してくる使用量は上限の目安なので,実際の式の保管では,通常,それより少ないメモリで間に合う.これは式の成分によっては共通なものがあり,全成分を保管する必要がなくなるからである.
f[1+x, 1+x]の式には成分が2つあるが,どちらも
1+xで同じである.実際には片方だけしか保管されないかもしれないし,両方とも保管されるかもしれない.
ByteCountの出す値は成分の共有がないことを前提とした使用量である.関連事項として,式成分の共有は
/.による置換操作等が行われると即座に無効になるので注意すること.
式の成分を強制的に共有するようにすることも可能である.それを行うには関数
Shareを使う.共有することで実際に使うメモリ量を低く押さえることができる.
| Share[expr] | expr を保管するとき共通成分を共有化する |
| Share[] | メモリに保管してある式の中で共通成分があれば共有化する |
メモリ使用量の最適化
多くのコンピュータシステムでは,実行中のプログラムは2つの部分から構成されている.プログラムが取得したメモリ空間,そして,スタック空間である.内部ルーチンが呼び出されるたびにスタック空間の一部が使われ,呼出しに関連した引数等のパラメータが一時保管される.多くのコンピュータシステムではプログラムの使うスタック量をあらかじめ指定しておかなければいけない.もし,実行時にスタック空間を使い切ってしまうと,プログラムは通常,強制的に終了してしまう.
Mathematica では,スタック空間は主に関数呼出し時に発生する各種の処理を行うために使われる.
Mathematica のスタック(
Stackで参照)にはすべてのレベルにおける関数の呼出しが記録される(詳細は
「評価処理用スタック」を参照のこと).スタックの大きさを変えるには大域変数
$RecursionLimitの値を変更する.設定値をあまり大きくし過ぎると,使用しているコンピュータシステムの許容量を超えてしまい,スタック空間を確保できなくなってしまうので注意が必要である.