Tips

スタックサイズを計算する

日付2006/07/07
ID43543 (英語原文参照)
バージョン2004
プラットフォームMac & Win

この記事は、最新ではないバージョンに関連した方法について解説しています。

最新のバージョンでは推奨されていないか、または他の方法で簡単に実現できる可能性があります。

4DのNew process関数およびExecute on server関数で新規プロセスを起動する場合、スタックサイズの設定が要求されています。

ドキュメントには、このサイズについて次のように記述されています:

プロセススタック:stackには、起動するプロセスのスタックとして割り当てるメモリの良を渡します。スタックとは、メソッド連鎖、ローカル変数、サブルーチの引数およびスタックされたレコードをいわば積み上げておくためのメモリ領域です。サイズはバイト単位で表現し、少なくとも64K(およそ64000バイト)を渡すことが推奨されていますが、メソッド連鎖が続く場合(つまりサブルーチンがサブルーチンをコールする構造が続く場合)
、さらに大きな数値を渡すことができます。必要であれば、200K(およそ200000バイト
のスタックを割り当てても構いません。

上記の説明では、特に値の上限には言及していません。4Dがアクセスできるのは、最大2GBのメモリであるため、理論上の上限値は2GB-(データベースを実行するために必要なメモリサイズ)です。

もちろん、750MBのスタックサイズなどというものは異常であり、利用可能なメモリのサイズがどうであれ、スタックサイズはプロセスの必要に基づいて算出されるべきです。したがって、どうすれば適切な値が決定できるのか、という点が問題になります。

上記のドキュンメントでは、大体64KB-200KBの値が提案されていますが、すべてのケースにそれが適用できるわけではありません。

特定のプロセスのための適切なスタックサイズは、次のいずれかのアプローチで決定することになります:

1. 設計に基づく値
2. 試験に基づく値

設計に基づく値:

デベロッパは、データベース設計に関する知識に基づき、より正確にスタックサイズを決定することができます。スタックされる情報は、前述のドキュメントで明確にされているので、そのプロセスで必要なスタックは大体予測することができます。

例えば、ローカル変数が1個、引数が1個、返り値が1個、それぞれ倍長整数のメソッドがあれば、少なくとも12バイトのスタックが必要です。このメソッドが再帰的にコールされる場合、スタックサイズは最低限、12バイトにコールの回数を掛けたものでなければなりません。

これは極端に簡略化した例ですが、データベースの設計が分かっていれば、スタックサイズは計算できる、ということの証明となっています。

試験に基づく値:

4D Packプラグインには、AP AVAILABLE MEMORYというコマンドがあり、特定のプロセスにおけるフリーのスタックサイズを調べることができます。デベロッパは、この値に基づき、スタックサイズを微調整することができます。

テストを実施する際には、そのプロセスがどれだけのスタックを必要とするかの全体像を把握することが肝要です。プロセスの処理範囲を網羅し、定期的にスタックサイズを調べるようにしてください。

最初は非常に大きなスタックサイズから始め、妥当な値に到達するまで少しずつ値を減らしてゆくと良いでしょう。