Main Content

メモリ マッピングの概要

メモリ マッピングとは

メモリ マッピングは、ディスク上のファイルの一部または全体を、アプリケーションのアドレス空間内の一定のアドレス範囲にマッピングする方法です。これによってアプリケーションでは、動的メモリへのアクセスと同様にディスク上のファイルにアクセスできるようになります。freadfwrite などの関数を使用する場合に比べ、ファイルの読み取りと書き込みが高速化します。

メモリ マッピングの利点

メモリ マッピングの主な利点としては、効率性、高速なファイル アクセス、アプリケーション間でのメモリの共有、および効率性の高いコーディングが挙げられます。

高速なファイル アクセス

メモリ マッピングによるファイルへのアクセスは、freadfwrite のような I/O 関数を使用するよりも高速です。データの読み取りと書き込みは、オペレーティング システムに組み込まれているバーチャル メモリ機能を使用して行われ、プロセス独自のデータ バッファーの割り当て、コピー、割り当て解除を行う必要はありません。

マップが最初に作成されたときに、MATLAB® によってディスクのデータへのアクセスは行われません。ディスク上のファイルの読み取りと書き込みは、メモリ マップの特定部分にアクセスされたときに行われ、その場合もその特定部分のみが読み取られます。これによって、マッピングされたデータへのランダム アクセスが高速化されます。

効率性

ファイルをメモリにマッピングすると、アプリケーションのアドレス空間の配列にデータを読み取った場合と同様に、データにアクセスできます。初めは MATLAB によって配列にアドレス空間が割り当てられるだけで、マッピングされた領域へのアクセスがあるまでは、ファイルから実際にデータが読み取られることはありません。その結果、メモリ マッピングが行われたファイルには、アプリケーションによって非常に大きいファイルのデータ セグメントにアクセスする方法が備わるため、最初にファイル全体をメモリに読み取る必要はありません。

効率的なコーディング スタイル

MATLAB アプリケーションでメモリ マッピングを使用すると、MATLAB 標準のインデックス操作を使用してファイル データにアクセスできます。ファイルをいったんメモリにマッピングすると、MATLAB ワークスペースからの変数の読み取りに使用するものと同じタイプの MATLAB ステートメントを使用して、そのファイルの内容を読み取ることができます。マッピングされたファイルの内容は、現在アクティブなワークスペース内の配列と同様に表示されます。この配列をインデックス処理するだけで、ファイルのデータを自由に読み取り、書き込めるようになります。このため、関数 fread および fwrite を明示的に呼び出す必要がなくなります。

MATLAB では、x をメモリ マッピングが行われた変数とし、y をファイルに書き込むデータであるとすると、ファイルへの書き込みは次のように単純になります。

x.Data = y;

アプリケーション間でのメモリの共有

メモリ マッピングが行われたファイルにはまた、下の図で示すように、アプリケーション間でデータを共有するための方法も備わっています。これは、各アプリケーションを使用して同じファイルの各セクションをマッピングすることによって実現します。この機能を使用すると、MATLAB と他のアプリケーション間で大きなデータセットの受け渡しができます。

また、1 つのアプリケーションにおいて、あるファイルの同じセグメントを複数回マッピングすることもできます。

どのようなときにメモリ マッピングを使用するか

メモリへのファイルのマッピングからどの程度効果が得られるかは、ファイルのサイズと形式、ファイルのデータが使用される方法、および使用しているコンピューター プラットフォームによって大きく左右されます。

メモリ マッピングが最も有効である場合

メモリ マッピングはバイナリ ファイルで以下のようなシナリオにおいて最も効果を発揮します。

  • 1 回または複数回ランダムにアクセスする大きなファイルの場合

  • メモリにいったん読み取って頻繁にアクセスする小さなファイルの場合

  • アプリケーション間で共有するデータの場合

  • ファイル内のデータを MATLAB 配列と同様に取り扱いたい場合

効果があまり顕著ではない場合

以下のタイプのファイルでは、メモリ マッピングの利点が十分には生かされません。

  • カスタマイズされたリーダーを必要とする HDF や TIFF のような書式設定済みバイナリ ファイルは、メモリ マッピングには適していません。こうしたファイルに含まれるデータの記述は、非常に複雑なタスクとなる場合があります。また、マッピングされたセグメントから直接にデータにアクセスすることはできず、代わりにデータを格納する配列を作成しなければなりません。

  • テキスト ファイルや ASCII ファイルでは、マッピングされた領域のテキストを適切な型に変換して、データが意味をもつようにする必要があります。これによって、追加のアドレス空間が消費されます。

  • サイズが数百メガバイトを超えるファイルでは、プログラムの処理に MATLAB で必要とするバーチャル アドレス空間のかなりの部分が消費されます。このサイズのファイルをマッピングすると、多くの場合 MATLAB でメモリ不足のエラーが発生します。これは、MATLAB がある程度の間稼動している場合や、MATLAB によって使用されるメモリが断片化した場合に発生しやすくなります。

メモリ マッピングの最大サイズ

オペレーティング システムと MATLAB の制限により、メモリ マッピングの単一のインスタンスでマッピングできるデータの最大量は 32 ビット システムで 2 ギガバイト、64 ビット システムで 256 テラバイトとなります。この制限を超えてマッピングする必要がある場合は、ファイルを領域に分けて別々のマップを作成するか、または 1 つのマップのウィンドウをファイルのさまざまな位置に動かすことができます。

バイト順

メモリ マッピングは、使用しているオペレーティング システムに固有のバイト順と同じバイト順スキームをもつデータにしか使用できません。たとえば、Linus Torvalds の Linux® システムでも Microsoft® Windows® システムでもリトルエンディアンのバイト順が使用されているため、Linux システムで作成されるデータは Windows システムで読み取ることができます。関数 computer を使用して、現在のシステムに固有のバイト順を調べることができます。