sqltypes_td.hヘッダー ファイルの中でmallocは、FNC_mallocを呼び出すように再定義されています。
ユーザー | 結果 |
---|---|
スタンドアロンのUDF、UDM、または外部ストアド プロシージャを開発、テスト、およびデバッグする場合 | malloc.hヘッダー ファイルをインクルードして、C標準ライブラリ関数のmallocおよびfreeを使用します。 |
ソース コードをサーバーにインストールする場合 | malloc.hをインクルードしないで、sqltypes_td.hヘッダー ファイルのmallocおよびfreeの定義を使用します。 それらの定義は、サーバーにソース コードをインストールする際には使用され、オブジェクトのインストール時には使用されません。 |
FNC_mallocおよびFNC_freeは、UDF、UDM、テーブル演算子、コントラクト関数、または外部ストアド プロシージャの終了前にすべてのメモリを解放するための検査を実施し、UDF、UDM、テーブル演算子、コントラクト関数、または外部ストアド プロシージャが割り振った一時メモリのすべてを解放しなかった場合にはトランザクションに対して例外を発行します。これは、データベースでメモリ リークが発生しないようにするためです。
FNC_mallocを呼び出してメモリを割り振るテーブル関数は、少なくともTBL_ENDまたはTBL_ABORTフェーズまでは、FNC_freeを呼び出してメモリを解放する必要はありません。したがって、テーブル関数は、FNC_TblAllocCtxが汎用スクラッチパッドに戻すアドレスを保存するために、FNC_TblGetCtxおよびFNC_malloc呼び出しを使用する必要があります。
1つの外部ルーチンが割り当てることができるメモリの最大量は、グローバル構成設定であり、そのデフォルトは32MBです。
メモリ割り当て限度を表示または変更するには、cufconfigユーティリティを使用できます。例えば、メモリ割り当て限度を表示するには、cufconfigの-oオプションを使用し、MallocLimitフィールドの設定を検出します。
cufconfig -o
cufconfigおよびMallocLimitフィールドの詳細については、<Teradata Vantage™ - データベース ユーティリティ、B035-1102>を参照してください。
これは必ずしも、外部ルーチンがいつでも最大量のメモリを割り当てられることを保証するものではありません。パフォーマンスを考慮して、外部ルーチンで割り当てるメモリは可能な限り少なくしてください。複数のUDFおよびテーブル演算子がデータベース上で並行して実行されることに留意してください。100 AMPシステムでは、1インスタンスについて10 MBを割り振るUDFまたはテーブル演算子を含む全AMP問合わせにおいて、1つのトランザクションだけで全インスタンスのために1 GBを使用する可能性があります。
mallocとfreeを直接呼び出すようなロジックにすると、UDF、UDM、テーブル演算子、コントラクト関数、または外部ストアド プロシージャで正しくメモリを解放してもメモリ リークが発生する可能性があります。それは、ユーザーがトランザクションをアボートしたり、実行中のUDF、UDM、テーブル演算子、コントラクト関数、または外部ストアド プロシージャには認識されていない別のノードで何らかの制約違反が発生したためにトランザクションがアボートしたりすると、実行中でもUDF、UDM、テーブル演算子、コントラクト関数、または外部ストアド プロシージャがアボートする可能性があるためです。