今回の記事はACCESSです。
実行時エラー3035、「メモリー不足です」というエラーが発生した時の対処方法です。
「タスクマネージャーからCPUコアを限定する方法」を紹介します。
前提条件として「ファイルサイズ2GB」は超えていません。
また、以下の対策はNGだったのでこのページでは説明していません。
- メモリ開放を目的として、VBA内でCLOSE、NOTHINGを正しく使用する
- 「DAO.DBEngine.SetOption dbmaxlocksperfile」でレコードロック数を変更する
- トランザクション処理に変更
※以下のページではCPUコアを指定してACCESSを実行する方法を紹介しています。
メモリー不足対策、CPUコアを指定してACCESSを実行する方法
効果のあった対処方法
「タスクマネージャー」を起動してプロセスのCPUマッピングを1つに限定する方法
①ACCESSを起動します。
②ACCESSを起動したままの状態で「タスクマネージャー」を起動します。
③タスクマネージャーの「プロセス」タブのMSACCESS.EXEで右クリックします。
④「関係の設定」を選択します。
⑤〈すべてのプロセッサ〉のチェックを外します。
⑥任意のCPUひとつだけをチェックします。
⑦「OK」で終了します。
タスクマネージャーの操作が煩わしい方へ
ショートカットを利用してCPUコアを指定してACCESSを起動する事ができます。
この方であればタスクマネージャーから設定を変える必要はありません。
※詳しくは以下のページで紹介しています。
エラーが発生したときの状況
ACCESSバージョンは2013、データベース形式はmdbを使用しています。
ファイルサイズは250MB、2GBを超えていません。
VBAマクロ実行中に「メモリー不足です」というメッセージで処理が中断します、プログラム実行時間は約2.5時間です。
エラーが発生するテーブルのレコード件数は28,427件です。
エラーが発生する場所は限定さていません、以下のケースではMoveNextステートメントでエラーが発生しています。
CPUコアを限定した結果
ACCESSを起動する度に設定を変更する煩わしさは有ります。
しかし、エラーで何度もマクロが停止するよりは遥かに快適です
完全に解決したわけでなく、これでエラーで停止することがあります。
週に一度しか使わないプログラムなのでこれで対応する事にしました、期限なしの暫定対策です。
他に試した対策方法
以下は他に試した対策です、レジストリを変更する以外の考えられる対策は全て試しました。
結果としては、あまり効果は感じられませんでした。
①ACCESSファイルを分けてリンクテーブルにする
②データベースの最適化
③開いたテーブルを「Close」や「Nothing」をきちんと閉じて解放させる
④「DAO.DBEngine.SetOption dbmaxlocksperfile」でレコードロック数を変える
⑤「BeginTrans」、「CommitTrans」を使用してトランザクション処理に変更する
最終的にはプログラムの作り直し
ショートカットからプログラムを実行していましたが、プログラムを全て作り直しました。
作り直しはメモリー開放などを意識した部分的な変更ではありません。
変更前のプログラムは、モジュールの付け足しなどで効率が悪くなっていました。
データ処理を効率良く行えるようにプログラム全体の流れを変えました。
以下は変更前と変更後の比較です。
「SELECT発行回数」はデータを読み込むために発行した、SQLステートメントのSELECT句の発行回数です、読み込みの結果がゼロ件でもカウントしています。
「レコード件数」はSQLステートメントを発行して読み込みが行われたレコードの件数です、この件数の数だけ何かの処理が行われています。
項目 | 変更前 | 変更後 |
---|---|---|
処理時間 | 3時間12分 | 0時間45分 |
SELECT発行回数 | 54,783回 | 79,092回 |
処理レコード件数 | 153,970件 | 54,720件 |
ファイルサイズ | 356MB | 66MB |
プログラムを作り直した結果、DBへのアクセス回数は増えたが、読み込まれたレコード件数が圧倒的に少なくなり、処理時間が大幅に短縮できました。
変更前のプログラムの状況
変更後のプログラムの状況
まとめ
必ず効果があるとは言えませんが、今回はプログラムの作り替えで全て完了しました。
小手先での対策よりも「基本が大事」と改めて思いました。
ACCESSのファイルサイズは2GBまでですが、テーブル単位でのサイズ制限もあるようです。
ACCESSは便利ですがデータ件数が多い場合は別のデータベースを検討したほうが良さそうです。
ACCESS参考書はこちらです!!
基礎を学びたい方は参考にどうぞ!!