[pgsql-jp: 33501] Re: select文でセグメンテーション違反

Hitoshi Taniguchi taniguchi @ chihaya-t3.co.jp
2004年 7月 5日 (月) 16:29:44 JST


谷口@質問者です。

ご説明ありがとうございます。以下の様に理解しました。
===============================================
postgresqlの各種処理(ソート、マージ等)におけるサイズの制限は、
実メモリ、仮想メモリとその共有メモリの設定によるが、
その結果を取り込む時点で、3Gbyte(hugemem kernelで4Gbyte)の
制限があり、LIMITやOFFSET等を使用して小分けに抽出するしかない。
32ビットCPUでは、実メモリや仮想メモリを増やしても無関係である。
===============================================
言葉足らずのところがありますので正確ではありません。

どうしようもないということが分かれば、対策は考えられます。
ちなみに、実際のデータは100GBを超えるので、条件を設定し、
抽出したデータで5Gbyteを超えるものもあるのですが、
その場合には、適した方法で小分けして対応することとします。
とてもすっきりしました。ありがとうございました。
その他の方々のご助言もとても参考になりました。
ありがとうございました。

>  福島@初投稿です。
>
> On Mon, 5 Jul 2004 13:57:35 +0900
> "Hitoshi Taniguchi" <taniguchi @ chihaya-t3.co.jp> wrote:
>
> > 谷口@質問者です。
> >
> > > SELECT count(*) FROM test50m ORDER BY key1;
> > は、以下のメッセージがでて実行できませんでした。
> > Attribute test50m.key1 must be GROUPed or used in an aggregate function
> > もちろん、石井殿の意図は分かりましたので以下をテストしてOKでした。
> > SELECT count(*) FROM test50m;
> > さらに、以下もOKでした。
> > SELECT key1 FROM test50m;
> > SELECT key1 FROM test50m ORDER BY key1;
> > つまり、SORT等の処理が終了した後、結果を全てpsqlに取り込み
> > その時点で、メモリのオーバーフローになるということだと理解できます。
> > そこまでは、私も理解できるのですが、実際にはそう単純でも無いようです。
> > SELECT * FROM test50m; でエラーになるのが理解できません。
>
>  メモリオーバーフローの問題に関して kernel パラメータや postgresql.conf
> 等を調整して解決されようとしていらっしゃるようですが、今回発生している問
> 題は、クライアント側で発生しているメモリオーバーフローですので、無意味だ
> と思います。
>
>  最初の投稿で、使用しているマシンの CPU が XeonMP ということでしたので、
> ia32 アーキテクチャの制限として、通常の kernel を使用しているのであれば、
> プロセス毎に 3GB のユーザスペース、hugemem kernel を使用したとしても 4GB
> のユーザスペースしかありません。これを超えるような結果セットを psql が
> postmaster から受け取ろうとしてオーバーフローしたと考えられます。
>
> CREATE TABLE test1m(
>     key1    char(5),
>     key2    char(5),
>     key3    char(5),
>     key4    char(5),
>     pad     char(80)
> );
> ということでしたので、
> SELECT key1 FROM test50m;
> SELECT key1 FROM test50m ORDER BY key1;
> 上記2つがエラーにならなくて、
> SELECT * FROM test50m;
> これがエラーになるのは、psql が取り込もうとしているデータ量を計算してみ
> ればわかるかと思います。
>
>  解決策はいくつかあるのですが、それ以前にお聞きしたいことがあるのですが、
> どのようなデータ分析を行おうと考えられているのでしょうか?条件無しで全件
> を抽出するということがデータ分析を行う上で頻繁に必要になるのでしょうか?
>
>  解決策ですが、ユーザスペースが広い 64bitプロセッサマシンに乗り換えるっ
> ていうのは現実的ではないので、いくつかあげてみます。
>
>  LIMIT OFFSET を用いて、ユーザスペースに到達しない範囲で、何度かに分け
> てデータ抽出を行う。
>
>  psql で処理を行うのでなく、ユーザアプリを書くのであれば、CURSOR を利用
> して、データをこまめに抽出するようにする。
>
>  といったところではないでしょうか。
>
> ---------------------------------------------------------
> FUKUSHIMA Katsuaki at Seino Information Service Co., Ltd.
> e-mail   kfukushima @ sis.seino.co.jp





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