大きなテキストファイル入力(〜500k行)とそれに続くのに関するパフォーマンスの問題があります。拡張されたパフォーマンスを持つテキストファイルから再配線を削除する
2つのヘッダ行がテキストファイルのどこかに再表示することができることpecularityと、以下の例示的な構造を有するテキストファイルdata.txt
を検討:
Name Date Val1 val2
--- ------- ---- ----
BA 2013-09-07 123.123 1232.22
BA 2013-09-08 435.65756 2314.34
BA 2013-09-09 234.2342 21342.342
Iが書いたコードが動作されている以下の:
%# Read in file using textscan, read all values as string
inFile = fopen('data.txt','r');
DATA = textscan(inFile, '%s %s %s %s');
fclose(inFile);
%# Remove the header lines everywhere in DATA:
%# Search indices of the first entry in first cell, i.e. 'Name', and remove
%# all lines corresponding to those indices
[iHeader,~] = find(strcmp(DATA{1},DATA{1}(1)));
for i=1:length(DATA)
DATA{i}(iHeader)=[];
end
%# Repeat again, the first entry corresponds now to '---'
[iHeader,~] = find(strcmp(DATA{1},DATA{1}(1)));
for i=1:length(DATA)
DATA{i}(iHeader)=[];
end
%# Now convert the cells for column Val1 and Val2 in data.txt to doubles
%# since they have been read in as strings:
for i=3:4
[A] = cellfun(@str2double,DATA{i});
DATA{i} = A;
end
私はオーデルの文字列がDATA
の至る所にヘッダー行を削除することができるようにすべてを読み込むことにしました。
時間を停止すると、と比較して、str2double
の方が早い選択肢ですが、コードの最も遅い部分が変換[A] = cellfun(@str2double,DATA{i})
であることがわかります。 2番目に遅い部分はtextscan
です。
この問題を解決するには、より早い方法がありますか?
さらに明確にする必要がある場合はお知らせください。私が見たことのない非常に明白な解決策があるなら、私は今3週間Matlabに取り組んでいます。
これは私のデータでうまくいきました。文字列を二重に変換するのを避けると、時間が約60%短縮されます! – Lukas