課題
- Matlabはcsvファイルをimportするのが遅い.
- 大量の実験データ(数十Mbyteのcsvファイル結構沢山ある.)
解決方法
- 実験データを保管しているフォルダ内のcsvを検索しリスト化.
- 1つ目のファイルを一度Workspaceに取り込み,その値をMatファイル形式で保存.
- 全てのcsvファイルに対して上記2の処理をfor文で実施.
使用Matlab関数
- addpath()
- dir();
- importfile(); Import機能で半自動で実装できる関数です.
- fileparts();
- save()
今回はJINS MEME ACADEMIC PACKを使って実験したので,そちらのデータをサンプルにします.
JINS MEMEで計測したデータのサンプル
// Data mode : Full
// Transmission speed : 100Hz
// Accelerometer sensor's range : 2g
// Gyroscope sensor's range : 250dps
//
//ARTIFACT,NUM,DATE,ACC_X,ACC_Y,ACC_Z,GYRO_X,GYRO_Y,GYRO_Z,EOG_L,EOG_R,EOG_H,EOG_V
,1,2016/04/01 08:27:35.29,919,1321,-15849,732,-659,-396,-128,316,-444,-94
,2,2016/04/01 08:27:35.30,1077,1250,-15779,679,-453,-441,-113,334,-447,-110
,3,2016/04/01 08:27:35.31,1161,1189,-15779,685,-254,-456,-97,348,-445,-125
,4,2016/04/01 08:27:35.32,1093,1200,-16087,687,-94,-474,-86,354,-440,-134
,5,2016/04/01 08:27:35.33,943,1147,-16451,630,-2,-456,-80,361,-441,-140
,6,2016/04/01 08:27:35.34,1009,1115,-16666,554,-24,-393,-75,366,-441,-145
,7,2016/04/01 08:27:35.35,954,1069,-16648,448,-106,-300,-75,363,-438,-144
100Hzでサンプリングしているので1時間計測すると100×60×60=36万行程度になり,ファイルサイズも20Mbyte程度になります.
これをMATLABでcsvread()などすると結構時間がかかる.いや,アホみたいに時間がかかります.
(もし5秒程度で読み込む方法があるなら教えて頂けると嬉しいです.)
一方でMatファイル形式だと結構あっさり読み込みなどが終わります.
ということで,大量のcsvファイルをMatファイルに変換する方法をメモ.
前提
- csvをImportするm-file(コード中の"import()")は事前に作ってあります.
- 計測データ(csvファイル)があるフォルダへのパスを通して,csvファイルが検索できる状態になっている.(参考)
% add folder path if needed
addpath('/Users/***/****/folderA')
% Search csv files in folder-A. Type of "files" is structure.
files = dir('/Users/***/****/folder-A/*.csv');
% Transform csv into MAT
for i=1:1:length(files)
%Import csv file to workspace
[ARTIFACT,NUM,DATE,ACC_X,ACC_Y,ACC_Z,GYRO_X,GYRO_Y,GYRO_Z,EOG_L,EOG_R,EOG_H,EOG_V]=importfile(files(i).name);
%Split filename in folder path, file name, and extention.
[path, name, ext] = fileparts(files(i).name);
%save mat
extention='.mat';
matname=[name extention];
save(matname);
end