ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

memmapfile

ファイルに対するメモリ マップの作成

構文

  • m = memmapfile(filename)
  • m = memmapfile(filename,Name,Value)

説明

m = memmapfile(filename) は、既存のファイル filename をメモリにマップし、メモリ マップ m を返します。

メモリ マッピングとは、ディスク上のファイルの一部または全体を、MATLAB® のアドレス空間内の一定のメモリ アドレス範囲にマッピングするメカニズムです。これによって MATLAB は、ディスク上のファイルに対し、動的メモリへと同様にアクセスできるようになり、ファイルの読み取りと書き込みが高速化されます。メモリ マッピングにより、ファイル内のデータを MATLAB 配列であるかのように扱えます。

m = memmapfile(filename,Name,Value) は、1 つまたは複数の名前と値のペアの引数を使用して m のプロパティを指定します。たとえば、ファイルのデータ形式を指定できます。

すべて展開する

uint8 データのファイル全体をマップする

コマンド プロンプトで、現在のフォルダーに 10 個の uint8 値を含むサンプル ファイル records.dat を作成します。

myData = uint8(1:10)';

fileID = fopen('records.dat','w');
fwrite(fileID, myData,'uint8');
fclose(fileID);

records.dat のマップを作成します。memmapfile を使用する場合、既定のデータ形式は uint8 です。そのため、この場合には、必要な入力引数はファイル名だけです。

m = memmapfile('records.dat')
m = 

    Filename: 'd:\matlab\records.dat'
    Writable: false
      Offset: 0
      Format: 'uint8'
      Repeat: Inf
        Data: 10x1 uint8 array

MATLAB は records.dat ファイル全体をメモリにマップし、メモリ マップのすべてのプロパティを既定値に設定します。メモリ マップは変数 m に割り当てられます。この例では、コマンドは、ファイル全体を符号なし 8 ビット整数の列としてマップし、さらに、呼び出し側にその内容への読み取り専用のアクセスを与えます。

mData プロパティにアクセスして、マップされたデータを表示します。

m.Data
ans =

    1
    2
    3
    4
    5
    6
    7
    8
    9
   10

倍精度データのファイル全体をマップする

倍精度データのメモリ マップを作成します。構文は、その他のデータ型を指定する場合と同様です。

コマンド プロンプトで、現在のフォルダーに 10 個の double 値を含むサンプル ファイル records.dat を作成します。

myData = (1:10)';

fileID = fopen('records.dat','w');
fwrite(fileID,myData,'double');
fclose(fileID);

records.dat のメモリ マップを作成し、出力の Format プロパティを 'double' に設定します。

m = memmapfile('records.dat','Format','double')
m = 

    Filename: 'd:\matlab\records.dat'
    Writable: false
      Offset: 0
      Format: 'double'
      Repeat: Inf
        Data: 10x1 double array

Data プロパティには、records.dat の 10 個の倍精度値が格納されています。

ファイルの一部をマップして変更する

int32 データの大きな配列のメモリ マップを作成します。書き込みアクセスを指定し、既定値以外の Format 値と Offset 値を設定します。

コマンド プロンプトで、現在のフォルダーに 10,000 個の int32 値を含むサンプル ファイル records.dat を作成します。

myData = int32([1:10000]);

fileID = fopen('records.dat','w');
fwrite(fileID,myData,'int32');
fclose(fileID);

records.dat のメモリ マップを作成し、出力の Format プロパティを int32 に設定します。さらに、ファイルの最初の 9000 バイトを無視するように Offset プロパティを設定し、書き込みアクセスを許可するように Writable プロパティを設定します。

m = memmapfile('records.dat',...
               'Offset',9000,...
               'Format','int32',...
               'Writable',true);

9000Offset 値は、records.dat の最初の 9000 バイトがマップされないことを示しています。

メモリ マップの名前を入力して、すべてのプロパティの現在の設定を表示します。

m
m =
    Filename: 'd:\matlab\records.dat'
    Writable: true
      Offset: 9000
      Format: 'int32'
      Repeat: Inf
        Data: 7750x1 int32 array

Format プロパティは、メモリ マップによる読み取りまたは書き込み操作はいずれも、ファイルの内容を符号付き 32 ビット整数のシーケンスとして読み書きすることを示しています。Data プロパティには、7750 個の要素しか格納されていません。これは、ファイルの最初の 2250 個の値を表す records.dat の最初の 9000 バイトがマップされないからです。

mData プロパティにアクセスして、マップされたデータの最初の 5 つの要素を表示します。

m.Data(1:5)
ans =

        2251
        2252
        2253
        2254
        2255

特定の配列形状にファイルの領域をマップする

100 個の倍精度値を含むファイルの領域のメモリ マップを作成します。

コマンド プロンプトで、現在のフォルダー に、100 個の倍精度値を含むサンプル ファイル mybinary.bin を作成します。

randData = gallery('uniformdata',[100,1],0,'double');

fileID = fopen('mybinary.bin','w');
fwrite(fileID,randData,'double');
fclose(fileID);

mybinary.bin の最初の 75 個の値を、フィールド名 x を使用してメモリ マップの構造体で参照できる、5 x 5 x 3 の倍精度値の配列にマップします。名前と値のペアの引数 Format を使用して以下のパラメーターを指定します。

m = memmapfile('mybinary.bin',...
               'Format',{'double',[5 5 3],'x'})
m = 

    Filename: 'd:\matlab\mybinary.bin'
    Writable: false
      Offset: 0
      Format: {'double' [5 5 3] 'x'}
      Repeat: Inf
        Data: 1x1 struct array with fields:
                x

Data プロパティは、マップされた値をフィールド x に含む構造体配列です。

マップされたデータを変数 A に割り当てます。Data プロパティは構造体配列なので、データにアクセスするにはフィールド x にインデックスを付けなければなりません。

A = m.Data.x;

A に関する情報を表示します。

whos A
  Name      Size             Bytes  Class     Attributes

  A         5x5x3              600  double                       

複数の配列にファイルのセグメントをマップする

さまざまな配列形状とデータ型を含むファイルのセグメントをメモリにマップします。

コマンド プロンプトで、現在のフォルダーにサンプル ファイル mybinary.bin を作成します。サンプルの圧力、温度およびボリューム値を表す uint16 データと倍精度データをファイルに書き込みます。この場合、各 uint16 配列は 50 行 1 列で、倍精度配列は 5行 10 列です。k はサンプルのスケーリング ファクターです。

k = 8.21;
[pres1,temp1] = gallery('integerdata',[1,300],[50,1],0,'uint16');
vol1 = double(reshape(k*temp1./pres1,5,10));
[pres2,temp2] = gallery('integerdata',[5,500],[50,1],5,'uint16');
vol2 = double(reshape(k*temp2./pres2,5,10));

fileID = fopen('mybinary.bin','w');
fwrite(fileID,pres1,'uint16');
fwrite(fileID,temp1,'uint16');
fwrite(fileID,vol1,'double');
fwrite(fileID,pres2,'uint16');
fwrite(fileID,temp2,'uint16');
fwrite(fileID,vol2,'double');
fclose(fileID);

一意の名前でアクセスできる配列にファイルをマップします。50 行 1 列 の uint16 値の配列を含むフィールド pressure を定義し、その後に 50 行 1 列 の uint16 値の配列を含むフィールド temperature を定義します。5 行 10 列の倍精度値の配列を含むフィールド volume を定義します。セル配列を使用してマップ領域の形式を定義し、このパターンを 2 回繰り返します。

m = memmapfile('mybinary.bin',...
'Format',{'uint16',[50 1],'pressure';...
'uint16',[50,1],'temperature';...
'double',[5,10],'volume'},'Repeat',2)
m = 

    Filename: 'd:\matlab\mybinary.bin'
    Writable: false
      Offset: 0
      Format: {'uint16' [50 1] 'pressure'
               'uint16' [50 1] 'temperature'
               'double' [5 10] 'volume'}
      Repeat: 2
        Data: 2x1 struct array with fields:
         pressure
      temperature
           volume

メモリ マップ mData プロパティは、Format が 2 回適用されるため、2 行 1 列の構造体配列になります。

Data プロパティを変数 A にコピーします。次に、double データの最後のブロックを表示します。このブロックには、フィールド名 volume を使用してアクセスできます。

A = m.Data;
myVolume = A(2).volume
myVolume =

     2    13    32     5     5    16     4    22     3     8
     2     9    53    38    13    19    23    85     2   120
    29    10     6     1     2     5     6    58    20    11
     7    15     4     1     5    18     1     4    14     8
     9     8     4     2     0     9     8     6     3     3

入力引数

すべて展開する

filename — マップするファイルの名前文字列

ファイル拡張子を含む、マップするファイルの名前。文字列として指定します。filename 引数にワイルドカード文字 (*? など) を含めることはできません。

例: 'myFile.dat'

データ型: char

名前/値のペアの引数

オプションの Name,Value 引数のペアをコンマ区切りで指定します。ここで、Name は引数名で、Value は対応する値です。Name は単一引用符 (' ') で囲まなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペアの引数を任意の順番で指定できます。

例: m = memmapfile('myFile.dat','Format','int32','Offset',255) は、ファイル myFile.datint32 データを 256 番目のバイトから開始するメモリにマップします。

'Writable' — マップ領域で許可されるアクセス タイプfalse (既定値) | true

マップされた領域に対して許可されるアクセスのタイプ。'Writable'true または false で構成されるコンマ区切りのペアとして指定します。Writable プロパティが false に設定されている場合、マップ領域は読み取り専用です。true の場合、書き込みアクセスが許可されます。

例: 'Writeable',true

データ型: logical

'Offset' — ファイルの先頭からマップ領域の先頭までのバイト数0 (既定値) | 非負の整数

ファイルの先頭からマップされた領域の先頭までのバイト数。'Offset' と非負の整数で構成されるコンマ区切りのペアとして指定します。この値は、ゼロを起点とします。すなわち、0 の Offset 値はファイルの開始を表します。

例: 'Offset',1024

データ型: double

'Format' — マップ領域の形式'uint8' (既定値) | 文字列 | n 行 3 列のセル配列

マップ領域のコンテンツの形式。'Format' と 1 つの文字列、または n 行 3 列のセル配列で構成されるコンマ区切りのペアとして指定します。

  • マップしているファイルの領域に 1 つのデータ型のみが含まれている場合は、そのデータ型を特定する文字列として Format の値を指定します。
    例: 'int16'

  • マップされたファイルに読み込まれたまたは書き込まれたデータに適用する配列の形状と、この配列を参照するフィールド名を指定するには、Format 値を 1 行 3 列のセル配列として指定します。最初のセルには、マップ領域に適用するデータ型を識別する文字列が含まれます。2 番目のセルには、領域に適用する配列の次元が含まれます。3 番目のセルには、メモリ マップの Data 配列で使用するフィールド名を指定する文字列が含まれます。
    例: {'uint64',[30 4 10],'x'}

  • マッピングする領域がさまざまなデータ型または配列の形状のセグメントから構成されている場合、n 行 3 列のセル配列を使用して、各セグメントの形式を個別に指定できます。ここで、n はセグメントの数を表します。
    例: {'uint64',[30 4 10],'x'; 'uint32',[30 4 6],'y'}

Format の値を指定する際には、次のデータ型が使用できます。

  • 'int8'

  • 'int16'

  • 'int32'

  • 'int64'

  • 'uint8'

  • 'uint16'

  • 'uint32'

  • 'uint64'

  • 'single'

  • 'double'

データ型: char | cell

'Repeat'Format パラメーターの適用回数Inf (既定値) | 正の整数

ファイルのマップ領域への Format パラメーターの適用回数。'Repeat' と正の整数で構成されるコンマ区切りのペアとして指定します。Repeat の値が Inf の場合、memmapfile はファイルの最後まで Format パラメーターを適用します。

例: 'Repeat',2000

データ型: double

出力引数

すべて展開する

m — メモリ マップmemmapfile オブジェクト

メモリ マップ。以下のプロパティをもつ memmapfile オブジェクトとして返されます。

プロパティ説明

Filename

マップされたファイルのパスと名前

Writable

マップ領域で許可されるアクセス タイプ

Offset

ファイルの先頭からマップされた領域の先頭までのバイト数

Format

マップされた領域のコンテンツの形式。データ型、配列サイズ、データへのアクセスに使用するフィールド名などを含む

Repeat

Format プロパティで指定されたパターンをファイルのマップされた領域に適用する回数

Data

ファイルからメモリにマップされたデータ。DataFormat プロパティで指定されたフィールド名をもつ数値配列または構造体配列

Data 以外のプロパティの値はすべて、memmapfile の呼び出し時に名前と値のペアの引数により設定されます。

m プロパティには構造体配列フィールドへのアクセス同様、ドット表記を使ってアクセスします。たとえば、Data プロパティのメモリにマップされたデータにアクセスするには、次のいずれかを実行します。

  • Data が数値配列の場合は、m.Data を呼び出します。

  • Data がスカラー (1 行 1 列) 構造体配列の場合は、m.Data.fieldname を呼び出します。ここで、fieldname はフィールドの名前です。

  • Data が非スカラー構造体配列の場合は、m.Data(index).fieldname を呼び出します。ここで、index は構造体配列の要素のインデックス、fieldname はフィールドの名前です。たとえば、Data の最初の要素の temperature フィールドのファイル データにアクセスするには、m.Data(1).temperature を呼び出します。

メモリ マップ m の作成後、Data 以外のすべてのプロパティの値は変更できます。新しい値を割り当てるには、ドット表記を使用します。たとえば、m に新しい Offset 値を設定するには、次のように入力します。

m.Offset = 2048;

詳細

すべて展開する

ヒント

  • 既存のファイルのみマップできます。新しいファイルを作成して、そのファイルを一度の操作でメモリにマップすることはできません。このファイルのメモリへのマップを行う前に、MATLAB ファイル I/O 関数を使用してファイルを作成してください。

  • 関数 memmapfile がファイルの位置を特定すると、MATLAB はファイルの絶対パス名を内部に保存します。そして、以降のこのファイルの位置の特定にはこの保存されたパスを使用します。これにより、現在の作業ディレクトリ以外のディレクトリで作業しながら、マップされたファイルへのアクセスを保てます。

  • memmapfile では、マップされたファイルに対する拡張や追加は行われません。代わりに、fopenfwrite のような標準ファイル I/O 関数を使用してください。

アルゴリズム

MATLAB アドレス空間へのファイルの実際のマッピングは、memmapfile オブジェクトを作成する際には実行されません。メモリ マップは、マッピングされたオブジェクトに現在格納されている情報に基づいており、そのオブジェクトの Data プロパティを最初に参照または変更したときに生成されます。

この情報は役に立ちましたか?