PR

【Access】メモリ不足です。【対処方法・原因】

Access
この記事にはアフィリエイト広告および広告が含まれています。

今回はAccessのクエリやマクロを使用した際に、
メモリ不足です。 と突然エラーコードがでてしまった場合の対処方法を紹介します。

メモリ不足です。

エラーの原因は?どんな状況で発生する?

エラーメッセージが「メモリ」とあるのでパソコンのメモリと勘違いしやすいですが、
原因はクエリやマクロを使用した際に、Accessファイルが2GBを超えてしまうためです。

Accessはファイル全体で最大2GBという制限があります。
私の場合、大規模データを扱うAccessの改修中、
突然「メモリ不足です。」と出て、 以下の対処をすることで解決できました。

<効果のあったこと>
・Accessファイルの最適化

<効果のなかったこと>
・メモリを8GBから16GBに増設
・仮想メモリを付与
MaxLocksPerFileというトランザクション処理の最大値を変更
・パソコン再起動
・Accessファイルの修復 等

対処方法

今回のエラーの原因が、Accessファイルが2GBを超過することにあるため、
対処方法は以下のファイルサイズ対策になります。

  • Accessファイルの最適化(おすすめ!)
    (手動・自動による最適化)
    Accessファイルを最適化することで、不要な領域を整理する
    メリット:簡単で、今まで通り利用できる
    デメリット:最適化しても容量が2GBを超える場合対応できない
  • Accessファイルの分割
    Accessファイルのデータを別のAccessファイルに作り、リンクテーブルで連携する。
    例)AccessAはAテーブル、AccessBはBテーブル。AccessAからBのリンクテーブルを貼る
    メリット:すべてのテーブル容量の合計が2GBを超過しても使用できる
    デメリット:個々のテーブル容量が2GBを超過すると使えない
  • DB構築
    SQLServerやPostgresなどDBを構築し、 データはDBからリンクテーブルで利用、編集や更新等はAccessで行う
    メリット:テーブルの容量が2GBを超過しても使用できる
    デメリット:DB構築は少しハードルが高い

ただ、「メモリ不足です。」エラーが出る場合、単純に最適化ができていないことが多いため、 次項からはAccessファイルの最適化だけに絞って説明します。

Accessファイルの最適化(手動)

手動で最適化する方法です。
最適化は数分程度かかることもあるため、ユーザーの都合のいいときに最適化できます。
デメリットは意識的に行わないとならないことです。

方法は、「ファイル」→「情報」から、「データベースの最適化/修復」を選択するだけです。

最適化 押すと、最適化が開始され、右下にメッセージが現れます。

Accessファイルの最適化(自動)

自動で最適化する方法です。
Accessファイルを閉じる際に、毎回最適化されるのでユーザーは意識せず最適化できます。
デメリットとしては、毎回最適化に時間がかかることや、
複数ユーザーで頻繁に使用すると破損するリスクがあるため、あまり使用しない方がいいという意見もあります。

方法は、「ファイル」→「Accessのオプション」から、「閉じるときに最適化する」を選択するだけです。

最適化

備考:「メモリ不足です。」エラーを再現するには

まず、以下のコードを実行して、2GB弱のデータを作ります。
(コード自体は2GB以上作ろうとするので、処理の途中でAccessが固まる or エラーになります)
コードは、「Microsoft Docs:Access テーブルで操作を実行すると、”ディスク領域またはメモリが足りない” というエラーが発生する」を参考にしています。

Sub CreateBigTable()
  Dim db As Database, rs As Recordset
  Dim iCounter As Long, strChar As String
  Set db = CurrentDb
  db.Execute "CREATE TABLE BigTable (ID LONG, Field1 TEXT(255), " & _
    "Field2 TEXT(255), Field3 TEXT(255), Field4 TEXT(255))", _
    dbFailOnError
  Set rs = db.OpenRecordset("BigTable", dbOpenDynaset)
  iCounter = 0
  strChar = String(255, " ")
  While iCounter <= 100000000
    rs.AddNew
    rs!ID = iCounter
    rs!Field1 = strChar
    rs!Field2 = strChar
    rs!Field3 = strChar
    rs!Field4 = strChar
    rs.Update
    iCounter = iCounter + 1
  Wend
  MsgBox "Done!"
End Sub

2GB

次に、できたテーブルを使用してクエリを作成し、動作させると 「メモリ不足です。」のエラーが再現できます。

タイトルとURLをコピーしました