行列形式 (つまり 4070x4070) の大きな MATLAB ファイル (150MB) があります。このファイルを MATLAB で処理する必要がありますが、このファイルを読み込めないようです。「メモリ不足」エラーが発生しています。このサイズのファイルをロードできる他の方法はありますか? 私は 32 ビット プロセッサを使用しており、2 GB の RAM を搭載しています。助けてください。この問題に対処するのに疲れ果てています。
3 に答える
リリースR2011b (ver.7.13) から、コンストラクターとしてMATFILEを持つ新しいオブジェクトmatlab.io.MatFileがあります。変数の一部を MAT ファイルに読み込んで保存することができます。詳細については、ドキュメントを参照してください。行列の一部を読み取る簡単な例を次に示します。
matObj = matfile(filename);
a = matObj.a(100:500, 200:600);
元のファイルが MAT ファイルではなく、何らかのテキスト ファイルである場合、部分的に読み取りmatfile
、後でアクセスできるようにそれらの部分を MAT ファイルの同じ変数に保存するために使用できます。Writable
コンストラクターでプロパティを true に設定することを忘れないでください。
テキスト ファイルがタブ区切りで数字のみを含むと仮定すると、ブロックごとにデータを読み取って MAT ファイルに保存するサンプル スクリプトを次に示します。
blocksize = 100;
startrow = 0;
filename = 'test.mat';
matObj = matfile(filename,'Writable',true);
while true
try
a = dlmread(filename,'\t',startrow,0); %# depends on your file format
startrow = startrow + blocksize;
matObj.a(startrow+(1:blocksize),:) = a;
catch
break
end
end
現在、テストする最新のリリースはありませんが、うまくいくことを願っています。
それが画像ファイルであり、それを操作したい場合は、matlab ブロック処理を試してください。これを使用すると、ファイルの小さな部分をロードできます。関数fun
は各ブロックに個別に適用されます。
B = blockproc(src_filename,[M N],fun)
xml
ファイルの場合は、 -XML DOM Node
と一緒にモードを試してくださいSAX
(指摘してくれた@Nzbuuに感謝します)が、それは文書化されていない機能のようです。
また、それが何らかのテキスト ファイルである場合 (データ量が多いため可能性は低い)、外部ツールで分割してみてください。
また、MATLAB のデータ ファイルのメモリ マッピングを使用して、ファイルのブロックを読み込んで処理し、ファイル全体を一度にメモリに読み込まなくても次のブロックに進むことができます。
たとえば、「100 個の倍精度浮動小数点数のファイルをメモリにマップする」この例を参照してください。