一般的なシステム制限
この付録では、すべてのサーバ側言語全体に適用可能な制限のいくつか示します。以下のトピックについて説明します。
識別子の名前の制限については、“識別子のルールとガイドライン” を参照してください。
その他のシステム全体の制限は、"Caché パラメータ・ファイル・リファレンス" を参照してください。
長い文字列の制限
変数の値には長さの制限があります。使用している環境で長い文字列が有効化されている場合 (リリース 2012.2 以降の新しいインストールでは既定)、上限は 3,641,144 文字になります。長い文字列が有効化されていない場合、上限は 32,767 文字になります。
長い文字列を有効化または無効化するには、管理ポータルを使用します。詳しい説明は、このドキュメントで前述した “長い文字列演算の使用可能化” を参照してください。(または、"Caché パラメータ・ファイル・リファレンス" の "EnableLongStrings" セクションの説明に従って、Caché パラメータ・ファイルで EnableLongStrings パラメータの値を指定します。)
Caché では、インスタンスごとにオプションで、長い文字列の使用もサポートしています。現在のインスタンスで長い文字列を有効にするには、Config.MiscellaneousOpens in a new tab クラスの EnableLongStringsOpens in a new tab プロパティを使用します。
プロセスで実際に長い文字列が使用されると、文字列用のメモリを、そのプロセス用のパーティション・メモリ領域から割り当てるのではなく、オペレーティング・システムの malloc() バッファから割り当てます。したがって、実際の長い文字列の値へのメモリ割り当ては、[システムメモリと開始設定] ページの [プロセス・メモリあたりの最大] で設定した制限の影響を受けません。また、プロセスの $STORAGE 値に影響することもありません。
“文字列” は、入出力デバイスからの読み取りの結果に限られないことを理解することが重要です。その他のコンテキストでも、文字列は出現します。たとえば、結果セット (SQL クエリ、多数の項目を含む $LIST の構築、または XSLT 変換などの出力として返される) の行に含まれるデータのコンテキストにも文字列が出現します。
長い文字列が有効化されていない場合、Caché は、公表されているアプリケーションの上限の性能を保証できなくなります。これらの上限は、特に明記されていない限り、長い文字列が有効化されていることを前提としています。
クラスの制限
以下の制限はクラスにのみ適用されます。
制限 : 50。1 つのクラスは最大 50 階層までのサブクラスを作成できます。
制限 : 1 クラスあたり 400。
制限 : 1 クラスあたり 400。
制限 : 1 クラスあたり 2000。
制限 : 1 クラスあたり 1000。
制限 : 1 クラスあたり 200。
制限 : 1 クラスあたり 1000。
制限 : 1 クラスあたり 200。
制限 : 1 クラスあたり 200。
制限 : 1 クラスあたり 10。
制限 : 1 クラスあたり 127。
制限 : 1 クラスあたり 200。
制限 : 1 クラスあたり 1000。
クラスおよびルーチンの制限
以下の制限はクラスとルーチンに適用されます。
制限 : 1 ルーチンまたは 1 クラスあたり 32768 の一意の参照。
以下は、メソッド名が同じでもクラス名が異なるため、2 つのクラス・メソッド参照としてカウントされます。
Do ##class(c1).abc(), ##class(c2).abc()
制限 : 1 ルーチンまたは 1 クラスあたり 32768 の一意の参照。
例えば、以下は 2 つのクラス名参照としてカウントされます。
Do ##class(c1).abc(), ##class(c2).abc()
同様に、以下も、2 つのクラス参照としてカウントされます。これは、%FileOpens in a new tab から %Library.FileOpens in a new tab への正規化がコンパイル時ではなく実行時に行われるためです。
Do ##class(%File).Open(x)
Do ##class(%Library.File).Open(y)
制限 : 1 ルーチンまたは 1 クラスあたり 32768。
X と Y が OREF の場合、以下は、1 つのインスタンス・メソッド参照としてカウントされます。
Do X.abc(), Y.abc()
多次元プロパティへの参照は、インスタンス・メソッドとしてカウントされます。これはコンパイラがこれらを区別できないためです。例えば、以下の文を考えてみます。
Set var = OREF.xyz(3)
コンパイラは、この文が xyz() メソッドを参照しているか、または多次元プロパティ xyz を参照しているかを区別できません。そのため、コンパイラはこれを、インスタンス・メソッド参照としてカウントします。
制限 : 1 ルーチンあたり 65535 行 (コメント行を含む)。この制限は、INT 表現のサイズに適用されます。
制限 : 1 ルーチンまたは 1 クラスあたり 65535 の ASCII リテラル。
ASCII リテラルは、どの文字も $CHAR(255) を超えない 3 つ以上の文字を含む引用符付き文字列です。
ASCII リテラルと Unicode リテラルは別々に処理され、個別の制限があります。
制限 : 1 ルーチンまたは 1 クラスあたり 65535 の Unicode リテラル。
Unicode リテラルは、1 つ以上の文字が $CHAR(255) を超える引用符付き文字列です。
ASCII リテラルと Unicode リテラルは別々に処理され、個別の制限があります。
制限 : 1 サブルーチン、1 メソッド、または 1 ストアド・プロシージャあたり 255 のパラメータ。
制限 : 1 ルーチンあたり 32767。
制限 : 1 ルーチンまたは 1 クラスあたり 32768。
この制限は、以下の例のように、プロパティの値の読み取りに関するものです。
Set X = OREF.prop
制限 : 1 ルーチンまたは 1 クラスあたり 32768。
この制限は、以下の例のように、プロパティの値の設定に関するものです。
Set OREF.prop = value
制限 : 1 ルーチンまたは 1 クラスあたり 65535。
この制限は、ルーチンまたはクラスの一意の参照 (^routine) の数に適用されます。
制限 : 1 ルーチンまたは 1 クラスあたり 65535。
ターゲットは label^routine (ラベルとルーチンの組み合わせ) です。
ターゲット参照はルーチン参照としてもカウントされます。例えば、以下は 2 つのルーチン参照と 3 つのターゲット参照としてカウントされます。
Do Label1^Rtn, Label2^Rtn, Label1^Rtn2
制限 : 1 ルーチンあたり 65535。
制限 (ObjectScript) : 1 プロシージャあたり 32763。
制限 (Caché Basic または MVBasic) : 1 ルーチンあたり 32759。
制限 (ObjectScript) : 1 ルーチンまたは 1 クラスあたり 65503。
制限 (Caché Basic または MVBasic) : 1 ルーチンまたは 1 クラスあたり 65280。
変数名やその他の識別子の長さ制限の詳細は、このドキュメントで前述の “識別子のルールとガイドライン” を参照してください。
その他のプログラミング制限
以下のテーブルに、コードを記述する際に関連するその他の制限を示します。
エラー・メッセージの長さ制限 : 32000 文字未満。
単一の %StatusOpens in a new tab 値に結合できる %StatusOpens in a new tab 値の最大数 : 150。
制限 : 32767 レベル。
これは、中括弧を使用するあらゆる言語要素の入れ子の最大の深さです。例 : IF { FOR { WHILE {...}}}
制限 : 1 行あたり 65535 文字 (長い文字列が有効な場合)。スタジオでは、32767 文字を超える行は編集できません。
"Caché グローバルの使用法" の “グローバル参照の最大長” を参照してください。
制限 : 511 文字 (エンコードされた文字数、入力した文字数 511 より少なくなる場合があります)。グローバル参照という用語は、グローバルの名前と、その添え字をすべて合わせたものを指します。詳細は、"Caché グローバルの使用法" の “グローバル参照の最大長” を参照してください。
制限 (10 進数形式またはネイティブ形式) : 約 1.0E-128 ~ 9.22E145。このドキュメントで後述する、“インターシステムズ・アプリケーションでの数値の計算” を参照してください。
制限 (倍精度形式) : このドキュメントで後述する、“インターシステムズ・アプリケーションでの数値の計算” を参照してください。