Phase.AGR_INITの集約フェーズ中、UDFはcontextの入力引数に対してinitCtx()メソッドを呼び出し、メソッドが格納する必要のあるオブジェクトまたはバイト アレイに基づいて中間記憶域の割り当てと初期化を行なう必要があります。
UDFにおいて、CREATE FUNCTION文のCREATE AGGREGATE句で指定されるinterim_sizeの値を超えるメモリを要求することはできません。パフォーマンスを最高にするためには、UDFで必要な分だけのメモリを中間記憶域に割り振るようにしてください。
メソッドが中間記憶域にバイト アレイを格納する場合は、中間記憶域のサイズは必要な総バイト数により決めることができます。標準偏差の例では、必要な総バイト数は24で、DOUBLE型の3つの値には十分なサイズです。
また、メソッドが中間記憶域にオブジェクトを格納する場合は、必要なメモリは次の方法で計算できます。
public static int getSize(Object obj){ int size=0; try{ ByteArrayOutputStream barr = new ByteArrayOutputStream(); ObjectOutput s = new ObjectOutputStream(barr); s.writeObject(obj); s.close(); size=barr.toByteArray().length; System.out.println("obj="+obj+",size="+size); }catch(IOException e){ e.printStackTrace(); } return size; }
標準偏差の例では、次のコードでagr_storageオブジェクトの初期化と、オブジェクト用の中間記憶域の割り当てを行ないます。
agr_storage s1 = new agr_storage(0,0,0); context[0].initCtx(s1);
また、中間結果の格納にバイト アレイを使用するメソッドの場合は、コードは次のようになります。
context[0].initCtx(24);