pqResultAlloc()

pqResultAlloc()は,libpqで検索結果を保存するときのメモリを確保する。

pqResultAlloc()は,PGRESULT_DATA_BLOCKSIZEで指定されている大きさのメモリブロックを確保して,PGresultのcurBlockに線形リストで管理する。
ブロックの割り当て済みのoffsetと空き容量は,PGresultのcurOffsetとspaceLeftで管理される。
メモリの要求があった場合,空き容量(spaceLeft)より小さいメモリの要求であれば,現在のブロックからメモリを割り当てる。
容量が足りないときは,mallocで新しいブロックを確保して,このブロックからメモリを割り当てる。

PGRESULT_DATA_BLOCKSIZEは2kbyteで定義されているが,大量のデータを取得するときは,2kbyteでは小さすぎで,mallocの呼び出しが頻繁に発生してしまう。
特にフィールド数が多いときは,レコードごとにsizeof(PGresAttValue) * nfieldsのデータ領域を確保するが,sizeof(PGresAttValue)は8byteなので,フィールドが200とかあると,レコードごとにmallocが発生することになる。
PQclear()で線形リストのメモリを開放するが,この処理の負荷も高くなる。