9

行列形式 (つまり 4070x4070) の大きな MATLAB ファイル (150MB) があります。このファイルを MATLAB で処理する必要がありますが、このファイルを読み込めないようです。「メモリ不足」エラーが発生しています。このサイズのファイルをロードできる他の方法はありますか? 私は 32 ビット プロセッサを使用しており、2 GB の RAM を搭載しています。助けてください。この問題に対処するのに疲れ果てています。

4

3 に答える 3

11

リリース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

現在、テストする最新のリリースはありませんが、うまくいくことを願っています。

于 2012-02-03T20:53:28.967 に答える
3

それが画像ファイルであり、それを操作したい場合は、matlab ブロック処理を試してください。これを使用すると、ファイルの小さな部分をロードできます。関数funは各ブロックに個別に適用されます。

 B = blockproc(src_filename,[M N],fun)

xmlファイルの場合は、 -XML DOM Nodeと一緒にモードを試してくださいSAX(指摘してくれた@Nzbuuに感謝します)が、それは文書化されていない機能のようです。

また、それが何らかのテキスト ファイルである場合 (データ量が多いため可能性は低い)、外部ツールで分割してみてください。

于 2012-02-03T19:07:56.437 に答える
1

また、MATLAB のデータ ファイルのメモリ マッピングを使用して、ファイルのブロックを読み込んで処理し、ファイル全体を一度にメモリに読み込まなくても次のブロックに進むことができます。

たとえば、「100 個の倍精度浮動小数点数のファイルをメモリにマップする」この例を参照してください。

于 2012-02-06T18:09:38.340 に答える