spkie log

主にPythonを使って医用画像処理をしている研究者の備忘録

xlsreadによるデータ読み込み速度を計測してみた

スタートして早速2週間ほど放置してしまいました…。すみません(汗)
でも今後もこんな感じのペースでやっていくかと思います(^^;


さて2つめの記事はプログラミングの話です。
最近はMATLABによるプログラミングをすることが多いのですが、
どうもファイル入出力が遅い…。


とは言っても研究で得たデータを読み込ませるのにファイル入出力は必須。
中でもExcelデータから読み込むxlsread関数はよく使うわけです。
そこで何とかxlsreadでの読みこみスピードを早めることは出来んかな?と考えました。


xlsread関数の引数に範囲を指定してやれば速くなったりするのかなと思って、
ちょっと実験をしてみることにしました。


まず実験をする環境を晒しておきますと、

(ご覧のとおり、若干古めのパソコンです…)

この環境で大体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とかでもやってみましたが、あまり変わらなかったです。)
範囲を狭めたり指定したりしたところであまりパフォーマンス向上には繋がらなさそうですね。


結論、こういう小手先の手段をとるよりか、なるべくファイル入出力の回数を減らした方がパフォーマンス向上に繋がるってことですね…。
てか、常識か(汗)