2012-02-03 22 views
9

私は、マトリックス形式の大きなMATLABファイル(150MB)(つまり、4070x4070)を持っています。私はこのファイルをMATLABで作業する必要がありますが、このファイルをロードできないようです。私は "メモリ不足"エラーが発生しています。このサイズのファイルをロードできる方法はありますか?私は32ビットプロセッサを使用しており、2GBのRAMを持っています。助けてください、私はこの問題に対処することから疲れています。MATLABで大きなファイル(〜150MB)を読み込むにはどうしたらいいですか?

+4

* .matファイル形式、または他の形式ですか? – hatboyzero

+1

私は非常にオープンしたとき150メガバイトのファイルが2GBのメモリを埋めることに驚いています!負荷をかけようとする前に、あなたのマシンの空きメモリ容量はどれくらいですか?あなたが閉じることができる他のプログラムはありますか? – japreiss

+0

これが.matファイルの場合、 'whos -file 'も問題を引き起こすか、単に 'load'ですか? .matファイルではない場合は、ヘッダーテキストはありますか? –

答えて

3

画像ファイルで、操作したい場合は、matlab block processingをお試しください。これを使用すると、ファイルの小さな部分を読み込むことになります。あなたの関数funは各ブロックに個別に適用されます。 (それを指摘するために@Nzbuuのおかげで)、それは文書化されていない機能のようです - 場合

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

それはxmlファイルがある、SAXと一緒XML DOM Nodeモードを試してみてください。

また、あらゆる種類のテキストファイル(おそらくデータ量のため)の場合は、分割する外部ツールを試してください。

+1

XML DOMはファイル全体を最初にメモリに読み込むため、ここでは役に立ちません。 SAXはXMLをストリームし、イベントを発生させてデータを処理します。また、私はMATLABのDOMオブジェクトの処理が遅いことを発見しました。 – Nzbuu

+0

@ Nbubu、ありがとう。何らかの理由で私はMatlabは常にSAXを使用しています。クイックグーグルサーチはあなたが正しいことを明らかにしました。 –

+0

私はそれがSAXを使ってDOMツリーを作成すると思います。 – Nzbuu

11

リリースR2011b(ver.7.13)より新しいオブジェクトmatlab.io.MatFileMATFILEがコンストラクタとして追加されました。 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 

私は最新のリリースを持っていません今テストするが、うまくいくと思う。

1

また、ファイル全体を一度にメモリにロードすることなく、ファイルのブロックを読み込んで処理し、次のブロックに進むこともできます。

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

+0

私は以前のリリースでMATLABに登場したばかりのときにこのオブジェクトを試しました。興味深いことに、MATLABはファイル全体をメモリにロードしなければなりませんでした。私はMathworksのサポートに連絡し、彼らはそれを確認しました。彼らは基本的に、異なるアプリケーション間で同時にデータを共有する機能としてこの機能を促進しました。まあ、ものが変わったように見えます。 R2011aでもう一度試してみました。そして 'memmapfile'オブジェクトは300bしか占めていません。いい答え。 +1。ファイルはこのオブジェクト(バイナリのみ?)のための規則的な構造を持たなければならないので、入力ファイルはたぶん再フォーマットする必要があります。 – yuk

関連する問題