大量のテキストファイルを解析してディスクに* .matファイルとして保存するので、その部分だけを簡単にロードできます(詳細はhereを参照してください)。ファイルの読み込み時、データの場合はhere)。これを行うには、一度に1行ずつ読み込み、その行を解析してファイルに追加します。問題は、ファイル自体がそこに含まれるデータより3桁以上大きいことです!それは非常に長い時間を取っていたと、ファイルサイズが巨大になっていたので、224515行の13813が解析された後、私は、コードを停止しMATLAB .matファイルのオーバーヘッドが非常に大きい
database = which('01_hit12.par');
[directory,filename,~] = fileparts(database);
matObj = matfile(fullfile(directory,[filename '.mat']),'Writable',true);
fidr = fopen(database);
hitranTemp = fgetl(fidr);
k = 1;
while ischar(hitranTemp)
if abs(hitranTemp(1)) == 32;
hitranTemp(1) = '0';
end
hitran = textscan(hitranTemp,'%2u%1u%12f%10f%10f%5f%5f%10f%4f%8f%15c%15c%15c%15c%6u%2u%2u%2u%2u%2u%2u%1c%7f%7f','delimiter','','whitespace','');
matObj.moleculeNumber(1,k) = uint8(hitran{1});
matObj.isotopeologueNumber(1,k) = uint8(hitran{2});
matObj.vacuumWavenumber(1,k) = hitran{3};
matObj.lineIntensity(1,k) = hitran{4};
matObj.airWidth(1,k) = single(hitran{6});
matObj.selfWidth(1,k) = single(hitran{7});
matObj.lowStateE(1,k) = single(hitran{8});
matObj.tempDependWidth(1,k) = single(hitran{9});
matObj.pressureShift(1,k) = single(hitran{10});
if rem(k,1e4) == 0;
display(sprintf('line %u (%2.2f)',k,100*k/K));
end
hitranTemp = fgetl(fidr);
k = k + 1;
end
fclose(fidr);
:ここ
は、私のコードのストリップダウンバージョンです。最後のプリントアウトは、私はただ10k行をクリアしたことを示しました。私はメモリをクリアした後、走っ:
S = whos('-file','01_hit12.mat');
fileBytes = sum([S.bytes]);
T = dir(which('01_hit12.mat'));
diskBytes = T.bytes;
disp([fileBytes diskBytes diskBytes/fileBytes])
と出力を得る:余分895664115バイトを取っている何
524894 896189009 1707.37141022759
を?ヘルプページに少し余分なオーバーヘッドがあると言われていることは分かっていますが、わかりやすいヘッダのGbは少し余計です。
新情報:
私は多分MATLABは行列がループ内でembiggenedと上の行列全体のディスク領域のチャンクを再割り当てされたときにそれがないと同じことをやっていたことを考えて、事前割り当てファイルを試してみましたそれぞれの書き込み、それはそれではありません。
8531570 71467 0.00837677004349727
これは私に多くの意味があります:私のショートチェックスクリプトが返すファイルに適切なデータ型結果のゼロでファイルを充填。 Matlabはファイルをまばらに保存しているので、ディスクファイルのサイズはメモリのフルマトリックスのサイズよりもずっと小さくなります。しかし、実際のデータで値を置き換えると、前と同じ動作になり、ファイルサイズがすべての妥当な範囲を超えて急激に増加し始めます。
新新情報:
は100行の長、データのサブセットにこれを試してみました。ディスクにストリームするには、データをv7.3形式にする必要があります。そのため、スクリプトでサブセットを実行し、メモリにロードしてからv7.0形式で再保存しました。ここでの結果は以下のとおりです。
V7.3:3800 8752 2.30
V7.0:3800 2561 0.67
不思議V7.3形式はデフォルトではありません。誰かがこれを回避する方法を知っていますか?これはバグか機能ですか?
あなたのOSは実際にディスク上でどれくらいのスペースが実際に使用されていると言いますか? – Daniel
857,185Kb(Windows 7 64ビット、MATLAB 2013a 64ビット) – craigim
確かに私にはバグのようですが、チャンクで書くことで回避できます。私は10,000の塊のためにそれを試み、ファイルは合理的なサイズです。 – chappjc