一般的なシステム制限
ここでは、InterSystems IRIS® データ・プラットフォームのシステム制限のいくつかを示します。
識別子の名前の制限については、"識別子のルールとガイドライン" を参照してください。
その他のシステム全体の制限は、"構成パラメータ・ファイル・リファレンス" を参照してください。
文字列長の制限
文字列の長さには、3,641,144 文字という制限があります。
文字列は、入出力デバイスからの読み取りの結果だけに限られないことを認識することが重要です。その他のコンテキストでも、文字列は出現します。例えば、結果セット (SQL クエリ、多数の項目を含む $LIST の構築、または XSLT 変換などの出力として返される) の行に含まれるデータのコンテキストにも文字列が出現します。
添え字の制限
ローカル変数、プロセス・プライベート変数、グローバル変数、およびロック名にはすべて、添え字を使用でき、以下の制限が適用されます。
-
どの添え字にも最大長があります。以下に示す添え字の最大長を超えると <SUBSCRIPT> エラーになります。
-
ローカル配列の場合、添え字の最大長はエンコード後で 32,767 バイトです。
-
グローバル配列の場合、添え字の最大長はエンコード後で 511 バイトです。
どの場合も、該当の文字数は、添え字および現在のロケールに応じて異なることに注意してください。
また、最長許容整数は 309 桁であり、この制限を超えると <MAXNUMBER> エラーになります。したがって、309 文字よりも長い数値の添え字は、文字列として指定する必要があります。
-
-
ローカル変数の添え字レベルの最大数は 255 です。グローバルまたはプロセス・プライベート・グローバルの添え字レベルの最大数は 253 です。添え字レベルの最大数を超えると <SYNTAX> エラーになります。
グローバル参照の最大長
グローバル参照 (つまり、特定のグローバル・ノードやサブツリーへの参照) の合計の長さは、エンコード文字数で最長 511 文字です (入力文字数で考えると、511 文字より少ない場合があります)。
任意のグローバル参照のサイズを慎重に決定する場合は、以下のガイドラインを使用します。
-
グローバル名の場合、1 文字ごとに 1 を加算します。
-
純粋な数字の添え字の場合、1 桁、符号、または小数点ごとに、1 を加算します。
-
数値以外の文字を含む添え字の場合、1 文字ごとに、3 を加算します。
添え字が純粋な数字ではない場合、添え字の実際の長さは、文字列をエンコードするために使用される文字セットによって異なります。マルチバイトの文字は 3 バイトまでとすることができます。
ASCII 文字は 1 または 2 バイトとなる可能性があることに注意してください。照合で大文字と小文字を区別する場合、ASCII 文字は、文字に対して 1 バイト、および曖昧性解消のバイトに対して 1 バイトとすることができます。照合で大文字と小文字を区別しない場合、ASCII 文字は 1 バイトとなります。
-
添え字ごとに、1 を追加します。
これらの数の合計が 511 より大きくなった場合、その参照は長過ぎということになります。
制限は決まっているため、長い添え字名やグローバル名にする必要がある場合、多数の添え字レベルを避けることをお勧めします。反対に、複数の添え字レベルを使用している場合は、長いグローバル名や添え字を避けます。使用している文字セットを制御できない場合があるので、グローバル名や添え字は短くすることが有用となります。
特定の参照について懸念がある場合、最長となりそうなグローバル参照と同等の長さか、それより若干長いテスト・バージョンのグローバル参照を作成することをお勧めします。それらテストのデータにより、アプリケーション構築前に、名前付け規約の修正についてのヒントが得られます。
クラスの制限
以下の制限はクラスにのみ適用されます。
制限 : 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 リテラルは別々に処理され、個別の制限があります。
制限 : サブルーチン、メソッド、またはストアド・プロシージャあたり 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。
制限 (ObjectScript) : 1 ルーチンまたは 1 クラスあたり 65503。
変数名やその他の識別子の長さ制限の詳細は、"識別子のルールとガイドライン" を参照してください。
その他のプログラミング制限
以下のテーブルに、コードを記述する際に関連するその他の制限を示します。
エラー・メッセージの長さ制限 : 32000 文字未満。
単一の %StatusOpens in a new tab 値に結合できる %StatusOpens in a new tab 値の最大数 : 150。
制限 : 32767 レベル。
これは、中括弧を使用するあらゆる言語要素の入れ子の最大の深さです。例 : IF { FOR { WHILE {...}}}
制限 : 1 行あたり 65535 文字。
制限 (10 進数形式またはネイティブ形式) : 約 1.0E-128 ~ 9.22E145。"インターシステムズ・アプリケーションでの数値の計算" を参照してください。
制限 (倍精度形式) : "インターシステムズ・アプリケーションでの数値の計算" を参照してください。