[pgsql-jp: 40496] Re: 仮想メモリが解放されない

錦戸 暖 d-nishikido @ eandm.co.jp
2010年 11月 4日 (木) 17:57:54 JST


  お世話になっております。錦戸です。
(2010/11/04 17:34), Hiroshi Inoue wrote:
> (2010/11/04 9:28), 錦戸 暖 wrote:
>> (2010/11/03 8:26), Hiroshi Inoue wrote:
>>> 井上です。
>>>
>>>> 調査した結果、以下のような単純なプログラムを実行した場合も
>>>> 確保した仮想メモリが減少しないことがわかりました。
>>>> ------------------------------------------------------------------
>>>> // COMの初期化
>>>> CoInitalizeEx(NULL, COINIT_MULTITHREADED)
>>>>
>>>> // コネクションの取得
>>>> _ConnectionPtr c;
>>>> c.CreateInstance(_T("ADODB.Connection"));
>>>> c.->Open(/*接続文字列*/,/*ユーザID*/,/*パスワード*
>>>> /,adConnectUnspecified);
>>>>
>>>> // レコードセットポインタの取得
>>>> _RecordsetPtr r;
>>>> r.CreateInstance(_T("ADODB.Recordset"));
>>>> r->CursorLocation = adUseClient;
>>>>
>>>> // SQL実行
>>>> r->Open(/*SQL文(SELECT)*/, _variant_t(IDispatch)c, true);
>>>>
>>>> // レコードセットのクローズ
>>>> r->Close();
>>>> r->Release();
>>>> r=NULL;
>>>>
>>>> // コネクションのクローズ
>>>> c->Close();
>>>> c->Release();
>>>> c = NULL;
>>>>
>>>> // COMの終了処理
>>>> ::CoUninitalize();
>>>> ------------------------------------------------------------------
>>>>
>>>> SELECT文により取得したデータのために確保された仮想メモリ使用量が
>>>> レコードセット、コネクションのクローズ後も確保されたままとなるので 
>>>> すが、
>>>> この現象は当然のことなのでしょうか?
>>>> 上記処理繰り返すと仮想メモリ使用量が徐々に増加してしまい、仮想メモリ
>>>> オーバーが発生します。
>>>
>>> こちらで簡単なケースを試してみましたが再現しません。何度位繰り返すと
>>> 発生するのでしょうか?
>> 以下のようなデータをSELECTした場合ならば、1度SQLを発行し終えた時点で
>> 発行前の仮想メモリ使用量までは減少しません。
>> レコード数:231427レコード
>> 1レコードのバイト数:327バイト
>
> 一度割り当てた仮想メモリが解放されないのは、当然と言い切る自信は
> ありませんが、不思議ではないと思います。私がお聞きしたかったのは
> 何度位繰り返すと仮想メモリオーバーになるのかということでした。
> 結構手間がかかるので、こちらのテストでは3~40回でやめています。
>
上記のレコードを取得するSQLを2回実行した時点でメモリオーバーします。
実行環境は以下の通りです。
使用可能実メモリ:1.2G
使用可能仮想メモリ:1.6G



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