Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


425 / 2272 ツリー ←次へ | 前へ→

【11757】レコードセットのメモリ解放のしかたについて えくせる 10/9/7(火) 22:30 質問[未読]
【11758】Re:レコードセットのメモリ解放のしかたに... 247b 10/9/7(火) 23:46 発言[未読]
【11759】Re:レコードセットのメモリ解放のしかたに... YU-TANG 10/9/8(水) 12:22 回答[未読]

【11757】レコードセットのメモリ解放のしかたにつ...
質問  えくせる  - 10/9/7(火) 22:30 -

引用なし
パスワード
   レコードセット変数に格納したキャッシュ値を解放するやり方について、ご回答頂けたらと思い、投稿します。

レコードセットの解放の方法としては、以下コード例(サンプル Subプロシージャ)の方法となります。
メモリ解放の確認を行うため、Windowsタスクマネージャのプロセスで、VBAから起動されているアプリケーションのメモリ容量を確認します。
しかし、解放したにも関わらず、キャッシュがメモリに蓄積されているままになり、後の全体のレスポンスに影響しています。
処理実行後、一気にメモリがふくれ上がり、物理メモリ領域を超えてしまい、フリーズしたかのように応答しません。
なにか良い「メモリ解放」手段を教えていただけませんでしょうか。

Sub サンプル()
Const cstrSQL As String = "SELECT文のSQL条件は絞り込み済み" 'フィールド指定で、*(アスタリスク)が原因かと思いましたが、結果同様。
Dim 変数名 As ADODB.Connection
Dim 変数名2 As ADODB.Recordset
Call 変数名.Open(接続式)
Set 変数名2 = 変数名.Execute(cstrSQL) 'ここで格納した時点で、メモリに蓄積される。
'*************
'なんらかの処理
'*************
Call 変数名2.Close '<=Recordset切断
Set 変数名2 = Nothing '<=Recordset解放・・・ここで、メモリ蓄積値が解放されないとダメ。
Call 変数名.Close '<=Connection切断
Set 変数名 = Nothing '<=Connection解放
End Sub

上記コードで、Close&Nothingは、単純にメモリ有効期間を無効にするだけで、メモリ解放までは行っていない気がします。
また、データベースがExcelである為、Access装備の最適化(JRO等)の機能は利用不可です。
(※実行中のレコードセット蓄積値を解放したいので、最適化は該当しない。)

▼環境
 ・OS: Windows xp
 ・CPU: Core 2 Duo
 ・メモリ: 1GB
 ・VBA: Excel 2007
 ・DB: Excel 2007

※実際、Excel VBA使用ですが、Excelに特化した質問ではないと思ったので、こちらで質問させていただきます。

以上、宜しくお願いします。

【11758】Re:レコードセットのメモリ解放のしかた...
発言  247b  - 10/9/7(火) 23:46 -

引用なし
パスワード
   ▼えくせる さん:
こんばんわ。247bです。経験談メインの話になりますが。

>しかし、解放したにも関わらず、キャッシュがメモリに蓄積されているままになり、後の全体のレスポンスに影響しています。
>処理実行後、一気にメモリがふくれ上がり、物理メモリ領域を超えてしまい、フリーズしたかのように応答しません。
>なにか良い「メモリ解放」手段を教えていただけませんでしょうか。

EXCELは一度確保したメモリはそのまま確保し続けます。解放する手段としては、一度EXCELを終了して、再起動すれば解放はされるはずです。
これはCOMの問題でもあるので、どうしようもないのではないかと。
逃げ方としては、EXCELアプリを2つ起動し、片方でもう片方の起動、再起動をコントロールするという策は思いつきますが、あまりお勧めしません。


>処理実行後、一気にメモリがふくれ上がり、物理メモリ領域を超えてしまい、
>フリーズしたかのように応答しません。

仮想メモリを使っている可能性があります。多分、取得しているデータ量が大きすぎるのだと思います。


>また、データベースがExcelである為、Access装備の最適化(JRO等)の機能は利用不可です。

上記の文章は、EXCEL上のデータをADODBで扱っているという意味でしょうか。
だとすると、それだけで相当にリソースを食うはずです。

もしくがデータが大きき過ぎる場合は、SQLを変更して件数を絞るということも対策として考えられます。それが可能であればですが。

【11759】Re:レコードセットのメモリ解放のしかた...
回答  YU-TANG  - 10/9/8(水) 12:22 -

引用なし
パスワード
   下記技術情報と関係あるかもしれません。

[BUG] ActiveX データ オブジェクト (ADO) を使用して、開いている Excel ワークシートを照会するときメモリ リークに発生します。
support.microsoft.com/kb/319998/ja

もし関係あるなら、下記エントリに興味深いコメントが
付いていますので、一読の価値があるかもしれません。

守破離でいこう!!: Excel VBA の ADO で、メモリリークが発生する
ishikawa.r-stone.net/2009/05/excel-vba-ado.html?showComment=1258510586562#c6331886271901611833

また、下記エントリを見る限りでは、OS を Vista に上げることでも
回避できそうです。

■続)ADOのメモリリーク1 - 半角チルダ
blog.goo.ne.jp/end-u/e/7c44c43f390de4b0ecea7e483afdd9b4

# いずれにしても、Access とはまったく関係ない気がしますが…。

425 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078193
(SS)C-BOARD v3.8 is Free