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

Hiroshi Inoue inoue @ tpf.co.jp
2010年 11月 4日 (木) 22:37:19 JST


井上です。

(2010/11/04 17:57), 錦戸 暖 wrote:
> お世話になっております。錦戸です。
> (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バイト

単純計算だと大した大きさにはならないのですが、327バイトの内容
(項目数とか方)はどんなものなのでしょうか?

>> 一度割り当てた仮想メモリが解放されないのは、当然と言い切る自信は
>> ありませんが、不思議ではないと思います。私がお聞きしたかったのは
>> 何度位繰り返すと仮想メモリオーバーになるのかということでした。
>> 結構手間がかかるので、こちらのテストでは3~40回でやめています。
>>
> 上記のレコードを取得するSQLを2回実行した時点でメモリオーバーします。
> 実行環境は以下の通りです。
> 使用可能実メモリ:1.2G
> 使用可能仮想メモリ:1.6G


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