2

matlab に入力する必要がある 1.6 GB の CSV ファイルがあります。これを頻繁に行う必要があり、すばやく実行する必要があります。ファイルの形式は次のとおりです。

20111205    00:00.2 99.18   6   E
20111205    00:00.2 99.18   5   E
20111205    00:00.2 99.18   1   E
20111205    00:00.2 99.195  5   E
20111205    00:00.2 99.195  5   E
20111205    01:27.0 99.19   5   E
20111205    02:01.4 99.185  1   E
20111205    02:01.4 99.185  1   E
20111205    02:01.4 99.185  1   E
20111205    02:01.4 99.185  1   E

私が今持っているコードは次のとおりです。

tic;
format long g
fid = fopen('C:\Program Files\MATLAB\R2013a\EDU13.csv','r');
[c] = fscanf(fid, '%d,%d:%d.%d,%f,%d,%c');
c = reshape(c, 7, length(c)/7)  
toc;

しかし、これでは遅すぎます。このCSVファイルを可能な限り最も効率的な方法でmatlabに取り込む方法をいただければ幸いです。ありがとうございました!

4

3 に答える 3

3

バイナリ ファイル形式の使用を検討してください。バイナリ ファイルははるかに小さく、MATLAB でバイナリ形式に変換する必要はありません。したがって、読み取りと書き込みがはるかに高速です。また、より正確になる場合もあります (精度が高くなる場合があります)。

http://www.mathworks.com.au/help/matlab/ref/fread.html

于 2013-06-12T05:47:38.797 に答える
1

推奨される構文は textscan ( http://www.mathworks.com/help/matlab/ref/textscan.html )です。

コードは次のようになります。

fid = fopen('C:\Program Files\MATLAB\R2013a\EDU13.csv','r');
c = textscan(fid, '%d,%d:%d.%d,%f,%d,%c');
fclose(fid);

最終的にセル配列になります...それを別の形状に変換する価値があるかどうかは、後でデータにどのようにアクセスするかによって異なります。

操作の大部分に使用できるメモリの量が少なく固定されているループを含めると、これはより高速になる可能性が非常に高くなります。大きなファイルを読み取る際の問題の 1 つは、ファイルの大きさが事前にわからないことです。これは、Matlab が必要なメモリ量を推測し、頻繁に再スケーリングする必要があることを意味します。これは非常に遅い操作です。たとえば、1 MB ごとに発生する場合、1 MB を 1 回コピーし、次の 2 MB をコピーし、次に 3 MB をコピーするなどです。ご覧のとおり、配列のサイズは 2 次です。

代わりに、最終結果に一定量のメモリを割り当て、より小さなバッチで処理すると、そのオーバーヘッドをすべて回避できます。はるかに高速になると確信していますが、ブロックサイズを少し試してみる必要があります。それは次のようになります。

block = 1000;
Nlines = 35E6; 
fid = fopen('C:\Program Files\MATLAB\R2013a\EDU13.csv','r');
c = struct(field1, field2, fieldn, value); %... initialize structure array or other storage for c ...
c_offset = 0;
while ~feof(fid)
  temp = textscan(fid, '%d,%d:%d.%d,%f,%d,%c', block);
    bt = size(temp, 1); % first dimension - should be `block`, except for last loop
    %... extract, process, store in c(c_offset + (1:bt))... 
    c_offset = c_offset + bt;
end
fclose(fid);
于 2013-06-12T05:44:06.963 に答える