関数 matfile
を使用した場合の配列の増加
多数の大きな値を MAT ファイルに書き込む場合、ファイルのサイズは非漸進的に増加します。この増加方法は想定された動作です。ただし、ファイルのサイズを増加させる回数を最小限に抑えて最適なパフォーマンスを確保するには、配列にデータを格納する前に初期値を割り当てます。
たとえば、書き込み可能な MatFile
オブジェクトがあるとします。
fileName = 'matFileOfDoubles.mat';
matObj = matfile(fileName);
matObj.Properties.Writable = true;
書き込む値のパラメーターを定義します。この例では、一度に 5 万個ずつ、100 万個の値を書き込みます。値の平均値は 123.4、標準偏差は 56.7 です。
size = 1000000; chunk = 50000; mean = 123.4; std = 56.7;
配列にデータを格納する前に、配列の最後の要素に初期値 0 を割り当てます。
matObj.data(1,size) = 0;
ファイルのサイズを表示します。
Windows® システムでは
dir
を使用します。system('dir matFileOfDoubles.mat');
UNIX® システムでは
ls -ls
を使用します。system('ls -ls matFileOfDoubles.mat');
この場合、matFileOfDoubles.mat
は 5000 バイト未満です。配列の最後の要素に初期値を割り当てると、大規模ファイルは作成されません。ただし、システムでは matFileOfDoubles.mat
のサイズが大きくなる可能性を考慮して準備が整えられます。
一度にチャンクを 1 つずつ、配列にデータを書き込みます。
nout = 0; while(nout < size) fprintf('Writing %d of %d\n',nout,size); chunkSize = min(chunk,size-nout); data = mean + std * randn(1,chunkSize); matObj.data(1,(nout+1):(nout+chunkSize)) = data; nout = nout + chunkSize; end
ファイルのサイズを表示します。
system('dir matFileOfDoubles.mat');
配列にデータが格納されたので、ファイル サイズが大きくなりました。