xlsreadによるデータ読み込み速度を計測してみた
スタートして早速2週間ほど放置してしまいました…。すみません(汗)
でも今後もこんな感じのペースでやっていくかと思います(^^;
さて2つめの記事はプログラミングの話です。
最近はMATLABによるプログラミングをすることが多いのですが、
どうもファイル入出力が遅い…。
とは言っても研究で得たデータを読み込ませるのにファイル入出力は必須。
中でもExcelデータから読み込むxlsread関数はよく使うわけです。
そこで何とかxlsreadでの読みこみスピードを早めることは出来んかな?と考えました。
xlsread関数の引数に範囲を指定してやれば速くなったりするのかなと思って、
ちょっと実験をしてみることにしました。
まず実験をする環境を晒しておきますと、
- MATLABのバージョン: 2013b
- CPU: Intel(R) Core(TM)2 Duo E6550 2.33GHz
- メモリ: 3.25 GB
- OS: Windows Vista Business Service Pack 2
(ご覧のとおり、若干古めのパソコンです…)
この環境で大体78 kBのファイル容量のExcelファイルをxlsreadで読み込み、その速度をtic, tocで計測します。
そのソースコードがこちら。
function TestXLSREAD() %% Excel file xlsfile = <Excelファイル>; sheet = <シート名>; %% Read all tic; [num, txt] = xlsread(xlsfile, sheet); toc; %% Read 1st row tic; [num, txt] = xlsread(xlsfile, sheet, '1:1'); toc; %% Read 1st row with range (1000 columns) ncol = 1000; colName = GetColumnName4Excel(ncol); xlRange = sprintf('A1:%s1', colName); tic; [num, txt] = xlsread(xlsfile, sheet, xlRange); toc; %% Read 1st row with range (100 columns) ncol = 100; colName = GetColumnName4Excel(ncol); xlRange = sprintf('A1:%s1', colName); tic; [num, txt] = xlsread(xlsfile, sheet, xlRange); toc; end
ちなみに中で列番号をExcelにおける列名に変換するために以下の関数を使ってます。
function colName = GetColumnName4Excel(colNumber) % GetColumnName4Excel: Get column name for Excel from column number % % Usage: GetColumnName4Excel(<column number>); % %% Initialize colName = ''; div = colNumber; %% Loop while 1 %% Divide & residue res = rem(div, 26); div = fix(div ./ 26); %% Transform residue to character ch = char(res + 64); %% Combine colName = [ch, colName]; %% Check divide if div == 0 break; end end end
これらのコードを使ってやってみた結果がこちら。
>> TestXLSREAD Elapsed time is 0.660840 seconds. Elapsed time is 0.761212 seconds. Elapsed time is 0.604831 seconds. Elapsed time is 0.586233 seconds.
1行目から
範囲を指定せずに読み込んだときの速度
1行目を指定して読み込んだときの速度
1行目を1000列読み込んだときの速度
1行目を100列読み込んだときの速度
なわけですが、あまり変わらないですね…(汗)
興味深いのが行を指定して読み込んだ時の速度より範囲指定しない時の速度の方が速いという結果。ちょっとxlsreadの中身まで確認する気にはなりませんが、どうやら範囲を指定した時とそうでない時とで実行しているコードに大きな違いがありそうです。
あと、100列にしても1000列にしてもあまり実行速度が変わらなかったことから、
(10000とか10とかでもやってみましたが、あまり変わらなかったです。)
範囲を狭めたり指定したりしたところであまりパフォーマンス向上には繋がらなさそうですね。
結論、こういう小手先の手段をとるよりか、なるべくファイル入出力の回数を減らした方がパフォーマンス向上に繋がるってことですね…。
てか、常識か(汗)