概要
「メモリが足りないのでこの処理を最後まで実行できません」、「メモリ不足のためこのアプリケーションを実行できません」というエラーが出ることがあります。この場合のメモリは、パソコン本体のメモリのことを指すのですが、Microsoft(R) MS-DOS(R) (以下 MS-DOS) の環境と異なり、その内容は複雑で多岐にわたっています。エラ
ー メッセージにはその対策として、起動中の他のアプリケーションを終了させて処理を継続して欲しいという回避方法が表示されますが、この情報だけでは不満な方もいらっしゃるでしょう。また、これでは対処できないケースもまれにはあります。
本文書では、Excel 5.0 を Microsoft(R) Windows(R) Version 3.1 (以下 Windows3.1、もしくはバージョンに関りがないときには単に Windows) 上で使用するにあたり直面するこのメモリ不足のエラーが指す意味を説明し、原因の確認方法とその対策を紹介するものです。
1. メモリ不足のエラーが発生する主な原因
ここでは、メモリ不足のエラーが発生する原因となるものを順を追って概要を解説していきます。
(1) XMS メモリの不足
XMS メモリの XMS とは Extended Memory Specification の略で、i80386 以上の CPU が持つ (エンハンスド モードでは) 4GB までのメモリを管理する規格です。Windows や MS-DOS の最新版では HIMEM.SYS という XMS ドライバ (XMM: Extended Memory Manager) がこれを実現しています。Windows はこの HIMEM.SYS から必要なメモリを貰って、アプリケーションに使わせています。ここで言う「 XMS メモリ」は XMMが管理するメモリ (仮想メモリも含む) です。
Windows 3.1 をエンハンスド モードで起動している場合には、実際に使用可能な物理メモリの 4 倍までの仮想メモリが使用できます。仮想メモリは、ハードディスクの一部をメモリの代わりとして使用し、実際に搭載されている物理的なメモリよりも多くを使用できるようにしたメモリのことです。この設定は、Windows 3.1 に添付のツール「コントロール パネル」にある「エンハンスド モード」で行えます。そして、その結果使用可能なメモリは、「プログラム マネージャ」の [ヘルプ] - [バージョン情報] コマンドで確認することができます。このコマンドを実行すると、ダイアログ ボックスが現れますが、その下部に現在の Windows のモードが表示され、その下に「メモリ: xxxxxx 使用可能」と表示される数字です。
ただし、スタンダード モードで使用される場合には仮想メモリが使用できません。実際に実相されている物理メモリのみしか使用できないのですが、このモードはi80286 用 (16 ビット CPU) のモードですので、物理メモリも最大 16MB までしか使用できません。
確認方法
これらは「プログラム マネージャ」の [ヘルプ] - [バージョン情報] コマンドを実行するとバージョンの情報とともに、使用可能残りメモリの容量が「メモリ」という項目として表示されます。メモリ不足のエラーが出た状態で、このコマンドを実行させてみてください。1MB も無い場合には注意をしてください。また、エンハンスドモードで Windows 3.1 を利用しているときに、スワップ ファイルの設定を一時にしている場合には、ディスクの容量不足ということも考えられます。「コントロール パネル」から「エンハンスドモード」を選択し、<スワップ ファイルの設定> ボタンを押して、スワップ ファイルの状態と作成ドライブを確認してください。その後、そのドライブのディスク空き領域が十分かどうか「ファイル マネージャ」で確認してください。
対応策
同時に起動させているアプリケーションの数を減らすことで対処できます。しかし、どうしても複数のアプリケーションを同時に起動させ作業させたい場合には以下の方法を取ります。標準モードでは 16MB の範囲まで物理的にメモリを増やします。これも不足する場合にはエンハンスド モードで使用するしかありません。もし、お使いのパーソナル コンピュータが 32 ビット CPU を持っていない場合には 32 ビットの CPU を持つパーソナル コンピュータをご用意いただく必要があります。エンハンスドモードの時には、物理的にメモリを増やす他にも、仮想メモリを増やす方法があります。これは「コントロール パネル」の「エンハンスド モード」の項目で設定できます。詳しくは Windows のマニュアルを参照してください。ただし、物理的にメモリを増やすよりは速度が遅くなります。
(2) システム リソース空き領域の不足
システム リソース領域とは、すべての Windows アプリケーションに共通の「リソース」を操作するための特別なメモリで、Windows のシステムが管理するメモリです。「リソース」には、メニュー、アイコン、カーソル、ウィンドウなどのユーザー インターフェイスに関るものと、ディスプレイやプリンタ デバイスに対して文字や図形を描画するために使用されるものの 2 つがあります。前者は USER.EXE、後者は GDI.EXE というファイル名の Windows のシステム、DLL (ダイナミック リンク ライブラリ) によって分けて管理されています。この領域は XMS メモリから確保されるものですが、その大きさは固定で、本体の実メモリをいくら増設しても増えることはありません。これは Windows 3.1 が 16 ビット CPU である i80286 もサポートする 16 ビット OS である制限からくるもので、増やす方法はありません。この領域の大きさは Microsoft(R) Windows (R) Version 3.0 (以下 Windows 3.0) と Windows 3.1 では、若干状況が異なります。Windows 3.0 では先程説明した USER.EXE と GDI.EXE が管理するリソースは総てそれぞれ 64KB です。しかし、Windows 3.1 では、USER.EXE が管理するリソースの内、メニューだけを別の64KB の領域を用意しています。この結果、Windows 3.0 では最大 64KB であったのに対し、Windows 3.1 では最大 128KB + 64KB になっています。残りの領域を確認するには、前項の XMS メモリと同様に「プログラム マネージャ」の [ヘルプ] -[バージョン情報] コマンドで行えます。「メモリ:」の下にある「システムリソース: xx % 使用可能」という数字がこれにあたります。このコマンドでは、USER.EXEか GDI.EXE のどちらかが不足しているかわかりません。このコマンドが表示する数字は、USER.EXE か GDI.EXE のシステム リソース領域の内、少ない方の数字になります。どちらが問題となっているのか知りたいときには、パソコン通信などで配布されているツールを使う方法があります。また、エラーを起こす前の状態であれば、Excel 5.0 の [?] - [バージョン情報] コマンドで表示されるダイアログ ボックス内の <システム情報> ボタンでそれぞれを知ることができます。
この数字は、多ければ多いほど良いのですが、可能であれば 40% 以上空いている状態でアプリケーションを使用されることをお勧めします。アプリケーションによっては、瞬間的にでも大量のリソースを使用することがあるからです。
また、環境 (特に ディスプレイ ドライバ) によっては、本来よりもメモリ不足を起こしやすいことがあります。特に DOS/V パーソナル コンピュータで、高い解像度を使用している方は注意する必要があるかもしれません。
確認方法
これらは「プログラム マネージャ」の [ヘルプ] - [バージョン情報] コマンドを実行するとバージョンの情報とともに、使用可能残りシステム リソース領域が % で表示されます。通常 40% 以上での使用をお薦めしますが、20% 以下であると、描画の際に一時的にメモリを消費することがありますので、注意してください。ディスプレイドライバ関連の問題を確認する場合には、最もベーシックなディスプレイ モード、DOS/V パーソナル コンピュータの場合には BASIC VGA モード (640 × 480、16 色同時発色) のモードで試してみてください。PC-9801 シリーズの場合にはハードウェアに標準のノーマル モードで確認してください。これらのテストの結果問題が無い場合には、パーソナルコンピュータのメーカーかディスプレイ アダプタおよびディスプレイ ドライバを供給しているメーカーのサポートに現象について問い合わせてみてください。新しいドライバが用意されているかもしれません。
対応策
システム リソースの大きさの制限は、Intel の CPU のアーキテクチャによるものです。i386 以上の CPU にターゲットを絞った 32 ビット OS とそれに対応するアプリケーションになったときまで根本的な解決はできません。ただし、システム リソースを消費を押さえるように使う側で工夫することはできます。
-
同時に起動しているアプリケーションの数を減らす
-
同時にオープンするワークシートの数を減らす
-
チャートやグラフィック オブジェクト、ボタンなどの数を減らす
-
画面に表示する領域を小さくする
(3) ディスクリプタ テーブルの不足
i80286 以上の CPU には、MS-DOS が管理できる 1MB 以上のメモリを管理する能力があります。このため CPU には MS-DOS が使用しているリアル モードの他にプロテクトモードとか仮想 86 モードというモードを備えています。これらのモードは同時に複数のアプリケーションを実行させることが前提となっており、あるアプリケーションが他のアプリケーションの使用しているデータを破壊しないような工夫がされています。プロテクト モードの「プロテクト (保護) 」とは、この仕組みを指しています。 また、複数のアプリケーションを同時に動作させようとすると、メモリの使い方に工夫が必要になります。時によってはメモリのブロックを移動させたり、仮想メモリで使用するように、ディスクとの間でスワップしなければならないでしょう。これらの作業をソフトウェアだけで行うのは時間的に大きな代償が必要となります。そこでこれらをサポートする機能が CPU には用意されています。その機能は、ソフトウェアがメモリをアドレスするときに、直接メモリをアドレスするのではなく、セグメント ディスクリプタ テーブルと呼ばれるテーブルをアクセスします。このテーブルはメモリの特定の場所に置かれ、その中に、実際のメモリのアドレスが格納されているのです。CPU はこの中身を変えることでメモリを保護したり、ブロックの移動/調整を行ったりできるのです。 ただ、このテーブルは無限ではありません。また、Windows 自身やアプリケーションは、同時にいくつものテーブルを使用します。ディスクリプタ テーブルは大きく 2 つに分けられます。環境全体で使用されるグローバルディスクリプタ テーブルと、アプリケーション毎に用意されるローカル ディスクリプタ テーブルというセレクタを格納するテーブルです。各テーブルは 8K 個 (8192) しか持てません。メモリ ブロック毎にこのテーブルを 1 つ消費してしまいます。このためテーブルを使いきったとき、メモリ不足として処理されることになります。
確認方法
それぞれのディスクリプタ テーブルの使用状況を見るのは困難です。アプリケーションの作り方次第で、そのアプリケーションの規模には関係が無く使用されます。ディスクリプタ テーブルがオーバー フローを起こすことは、現実には大変に少ないことでしょう。これはアプリケーションの設計者が考慮に入れることができる範囲だからです。オーバーフローを起こすようなことが想定されていれば、あらかじめアプリケーション側で (マニュアルなどで) 制限を課しているでしょう。
対応策
同時に動作しているアプリケーションの数を減らしたり、同時にオープンしているワークシートおよびそれに含まれる行数を減らすしかありません。これが影響するのは大規模なデータベースを作られているときだと思います。このような時には、Microsoft Access(R) でデータの加工、抽出を行った後、Excel 5.0 に持ってくるなどのアプリケーションのコンビネーションで解決するのが良いでしょう。
APPNOTE NO:
402556