ドキュメンテーション センター

  • 評価版
  • 製品アップデート

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

マッピングされたファイルの読み取り

はじめに

memmapfile クラスのプロパティで最も広く使用されるのが Data プロパティです。メモリ マップ オブジェクトのこのプロパティを使用して、MATLAB® ではマッピングされたファイル内容に対するあらゆる読み取りと書き込みのアクセスを行います。

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

ファイルをメモリにマッピングした後は、MATLAB ワークスペースからの変数の読み取りに使用するものと同じ MATLAB ステートメントを使用すると、そのファイルの内容が読み取れるようになります。メモリ マップ オブジェクトの Data プロパティにアクセスすることによって、マッピングされたファイルの内容は、現在アクティブなワークスペースにある配列と同様に表示されます。この配列をインデックス処理するだけで、ファイルのデータを自由に読み取れるようになります。

パフォーマンスの改善

MATLAB では、オブジェクトに含まれるデータよりも、構造体内のデータへのアクセスの方が効率的に行われます。その主な理由は、構造体では subsref ルーチンの追加オーバーヘッドを必要としないためです。memmapfile オブジェクトから直接読み取る場合は、次のようにします。

for k = 1 : N 
   y(k) = m.Data(k);
end 

代わりに、次の例で示すように Data フィールドを変数に割り当て、マッピングされたファイルをこの変数を使用して読み取ると、パフォーマンスが向上します。

dataRef = m.Data; 
for k = 1 : N 
   y(k) = dataRef(k);
end 

単一のデータ型の読み取り

この例では、100 個の倍精度浮動小数点数を含むファイルをメモリにマッピングする方法を説明します。このマップはファイルの先頭から 1,024 バイトのところから開始し、そこから 800 バイト (double の 8 バイト x Repeat 値の 100) で終了します。

倍精度浮動小数点数の 5,000 行 1 列の行列を含むテスト データ ファイル records.dat を生成します。

dmax32 = double(intmax('uint32'));
randData = gallery('uniformdata',[5000,1],0) * dmax32;

fid = fopen('records.dat','w');
fwrite(fid,randData,'double'); 
fclose(fid);

memmapfile オブジェクト m を作成し、その Data プロパティの形式を表示します。

m = memmapfile('records.dat','Format','double', ...
      'Offset',1024,'Repeat',100);

d = m.Data;

whos d
  Name        Size            Bytes  Class     Attributes

  d         100x1               800  double      

配列 m.Data のインデックスを指定して、選択した数値のセットをファイルから読み取ります。

d(15:20)
ans =
  1.0e+009 *
    3.6045
    2.7006
    0.5745
    0.8896
    2.6079
    2.7053

ファイル データから行列へのフォーマット

この例では、マッピングしたファイルからデータを読み取るときに 4 行 6 列の配列形式がデータに適用されるように、前の例で使用したファイル records.dat をマッピングする方法を説明します。

memmapfile オブジェクトを作成します。

m = memmapfile('records.dat',         ...
      'Format',{'double',[4 6],'x'},  ...
      'Offset',1024,'Repeat',100);

MATLAB により、ファイルの内容が数値配列ではなく構造体配列にマッピングされます。

オブジェクトの Data プロパティを変数 d に割り当てます。次に、d の形式を表示します。

d = m.Data;

whos d
  Name        Size            Bytes  Class     Attributes

  d         100x1             25264  struct        

構造体配列 d の 5 番目の要素を読み取ります。構造体配列には、フィールドが 1つ (x) あります。

d(5).x
ans =
  1.0e+009 *
    3.1564    0.6684    2.1056    1.9357    1.2773    4.2219
    2.9520    0.8208    3.5044    1.7705    0.2112    2.3737
    1.4865    1.8144    1.9790    3.8724    2.9772    1.7183
    0.7131    3.6764    1.9643    0.0240    2.7922    0.8538

MATLAB は、データを 4 行 6 列の配列で表示します。

構造体配列のインデックスを指定して、フィールド x の2 列目から6 列目までの3 行目にアクセスします。

d(5).x(3,2:6)
ans =
  1.0e+009 *
    1.8144    1.9790    3.8724    2.9772    1.7183

複数のデータ型の読み取り

この例では、複数のクラスを含むファイルをマッピングする方法を説明します。ファイルに含まれる異なったクラスは、返される構造体配列 m.Data のフィールドとしてマッピングされます。例では、オブジェクトの Data プロパティを読み取る別の方法を示します。

はじめに memmapfile コンストラクターを呼び出して、前の例で作成したファイル records.dat のメモリ マップ オブジェクト m を作成します。

m = memmapfile('records.dat',  ...
      'Format', {              ...
         'uint16' [5 8] 'x';   ...
         'double' [4 5] 'y' });

コンストラクターで渡される Format パラメーターによって、ファイルの最初の 80 バイトは uint16 の 5 行 8 列の行列として、その後の 160 バイトは double の 4 行 5 列の行列として扱うように指定します。このパターンはファイル終端まで繰り返されます。

Data プロパティを調べます。

d = m.Data
ans = 
166x1 struct array with fields:
    x
    y

166 要素の構造体配列に 2 つのフィールドがあり、各フィールドがコンストラクターの形式指定子に対応していることが MATLAB によって示されます。

配列内の構造体を 1 つ調べ、各フィールドの形式を表示します。

d(3)
ans = 
    x: [5x8 uint16]
    y: [4x5 double]

ファイルからその構造体の x フィールドを読み取ります。

d(3).x
ans =
  34432  47500  19145  16868  38165  47956  35550  16853
  60654  51944  16874  47166  35397  58072  16850  56576
  51075  16876  12471  34369   8341  16853  44509  57652
  16863  16453   6666  11480  16869  58695  36217   5932
  57883  15551  41755  16874  37774  31693  54813  16865

MATLAB は、Format プロパティの指定どおりにデータ ブロックの形式を uint16 値をもつ 5 行 8 列の行列に設定します。

ファイルからその構造体の y フィールドを読み取ります。

d(3).y
ans =
  1.0e+009 *
    3.1229    1.5909    2.9831    2.2445    1.1659
    1.3284    3.0182    2.6685    3.7802    1.0837
    3.6013    2.3475    3.4137    0.7428    3.7613
    2.4399    1.9107    4.1096    4.2080    3.1667

MATLAB は、データ ブロックの形式を double 値をもつ 4 行 5 列の行列に設定します。

マップ パラメーターの変更

この例では、メモリ マップ経由でファイルから読み取ったデータのフーリエ変換出力をプロットする方法を説明します。続いて、既存のマップのパラメーターをいくつか変更し、データ ファイルの別の部分から読み取りを行って、そのデータを基にヒストグラムをプロットします。

double 型の要素を 1,025 番目のバイトから 1,000 個マッピングして、メモリ マップ オブジェクトを作成します。

m = memmapfile('records.dat','Offset',1024,  ...
      'Format','double','Repeat',1000);

マップと関連付けられているデータを取得して、マップにおける最初の 1,000 の値の FFT (高速フーリエ変換) をプロットします。これまではデータが参照されなかったため、ここでマップが実際に作成されます。

plot(abs(fft(m.Data(1:1000))));

メモリ マップの情報を取得します。

mapStruct = get(m)
mapStruct = 
    Filename: 'd:\matlab\records.dat'
    Writable: 0
      Offset: 1024
      Format: 'double'
      Repeat: 1000
        Data: [1000x1 double]

マップを変更しますが、同じファイルを引き続き使用します。

m.Offset = 4096;
m.Format = 'single';
m.Repeat = 800;

ファイルの別の領域から読み取りを行い、データのヒストグラムをプロットします。これによって新しい領域がマッピングされ、前の領域のマッピングは解除されます。

hist(m.Data)
この情報は役に立ちましたか?