[pgsql-jp: 40497] Re: 大容量のテーブルに対してSQLを発行するとエラーになる件について

Itagaki Takahiro itagaki.takahiro @ gmail.com
2010年 11月 4日 (木) 18:16:19 JST


2010/11/4  <toshihideka4316 @ zenrin.co.jp>:
> 280万件のデータが入ったテーブル(テーブルサイズ:2161MB)に対して、全レコー
> ドを取得する単純なSQLを発行しましたところ、
> エラーが発生しました。
> メモリの消費量からして、メモリの制限にひっかかったとは考えにくいのですが...

32bitアプリケーションとお見受けします。32bitアプリだとユーザ用の
アドレス空間が2GBしか無いので、2GB全件を取得すると、クライアント側が
アドレス空間不足になるのは、よくあることです。

> ■メモリの消費量
> お手数ですが以下の2つについて教授願えないでしょうか。
> 1.サーバorクライアントの問題どちらであるか

クライアントです。
たぶん、実メモリの割り付け前にアドレス空間不足になったので、
一見メモリを消費していないように見えたのでしょう。
# とはいえ、普通は少しずつメモリを確保する気がするので、
# 1秒も経たないうちに OOM になるのは若干疑問ですが…

> 2.エラーとなる原因

2GBの全データを一度にメモリに保持しようとしたためです。
小分けにして取得する必要があります。
私は OLE DB には詳しくないのですが、JDBC の setFetchSize() に
相当する機能があれば、それを使うと解消できると思われます。
# なんとなくパラメータの名前的には UseDeclareFetch っぽい気が。

-- 
Itagaki Takahiro


pgsql-jp メーリングリストの案内