この記事では、LabVIEWでデータを保存する際に使用できるいくつかのファイル形式について、ファイル保存した際にどの程度の早さで保存できるのかについて比較した結果を紹介しています。
なお、具体的な処理時間は、PCの性能や他のアプリケーションが動作しているかなどの環境によっても変わりうるので絶対的な値ではありませんが、比較した際の例として参考になればと思います。
比較の方法について
本記事で対象としているファイル形式は以下の5つです。
- テキストファイル(csv)
- Excelファイル
- lvmファイル
- バイナリファイル
- tdmsファイル
正確にはファイル形式としてはテキストかバイナリかのどちらかになっていますが、上の5パターンはLabVIEWの中で使用する関数あるいは関数の設定がそれぞれ異なるので、これらを比較対象としました。
この中では、lvmファイルだけ聞き覚えがないという方も多いかもしれません。LabVIEW計測ファイルという、ある一定のヘッダ情報を持った計測値保存ファイルとなっています。
どの程度処理に時間がかかったかは、処理の前後でティックカウントを使用して計測しています。
処理としては100ミリ秒に一度10000のデータが得られこれを保存するという動作を100回繰り返すという状況を想定しています。
そのため、仮に保存に全く時間がかからなかった場合でもプログラムが終わるのに100ミリ秒×100で10秒はかかる処理なのですが、あとで示すように保存形式によって大きく時間が異なります。
プログラムの作りとしては実用的なデザインをという意味で生産者消費者デザインを採用しました。
また、キューの溜まり具合を逐次確認して、プログラムが終わるまでに最大どの程度キューがたまることがあったかを表示するようにしています。
キューが多く溜まるということはつまり生産者ループに対して消費者ループの処理に時間がかかっている、保存に多くの時間がかかっているということになります。
保存時間の比較
それではさっそく各保存形式での保存時間の結果を紹介します。
テキストファイル(csv)
まずは一番よく使用されるであろうテキストファイル形式です。拡張子は.txtでもいいのですが、データを見る際の便利さを考えて.csvを使用しました。
結果としては、保存に全く時間がかからなかった場合と比べると400ミリ秒しか増えていないものの、キューが少し溜まり気味になりました。この状態がさらに続くと、キューもどんどん溜まり、かかる時間も増大すると予想されます。
Excelファイル
Excelファイルへの保存方法は、厳密にはReport Generation Toolkitの関数を使用した方法もありますが、今回は「計測ファイルに書き込む」のExpress VIを使用しています。
今回比較した全形式の中で最も時間がかかり、かつキューに溜まった数も圧倒的に多くなりました。
Express VIを使用しない場合ではパフォーマンスが改善される可能性はありますが、少なくともExpress VIを使用する場合には注意が必要、ということになります。
Lvmファイル
lvmファイルについても「計測ファイルに書き込む」のExpress VIを使用しました。
こちらもテキストファイルではあるのですが、保存にそこまで時間がかからず、この後に紹介するバイナリ形式のファイルとほぼ変わらない速度で保存ができました。
バイナリファイル
バイナリファイルについては、バイナリファイルに書き込むの関数を使用します。
今回試した全ファイル形式の中で最も処理時間が早いという結果になりました。
Tdmsファイル
最後にtdmsファイルです。LabVIEWでデータ、特に波形データ(時間の情報も含まれた計測データ)を保存する際に推奨されているという形式です。他の形式と統一するため波形データではなく波形のY値を保存しています。
バイナリファイルとほぼ同じ結果となりました。tdmsはそもそもバイナリ形式で保存するため、似たようなパフォーマンスになったと考えられます。
ファイルサイズ比較
ついでに(?)各結果について保存されたデータのファイルサイズを比較してみました。
ファイル形式 | ファイルサイズ (kB) |
テキストファイル | 10,249 |
Excel | 9,427 |
lvm | 11,244 |
バイナリ | 7,813 |
tdms | 7,813 |
この結果を見ると、やはりバイナリファイルは保存の速度およびファイルサイズについて他の保存形式よりも優位であることがわかります。
lvmは速度こそバイナリ系に迫るパフォーマンスでしたが、ファイルサイズを考えるとExcelよりも重たいという結果になりました。
バイナリ系が速度もファイルサイズも良い成績なのですが、バイナリファイルは直接ファイルを開いても中身が読めません。LabVIEWのプログラムでバイナリファイルから読み取るプログラムを用意するなどして読み込むことになります。
tdmsファイルもベースはバイナリ形式なので保存時間やファイルサイズともにテキストファイルと比べてパフォーマンスが良く、かつExcelのアドインを使用することで中身をテキスト形式と同じように確認できるので便利です。
データを取得、保存している状態では高効率のtdmsで保存して、後でゆっくり他のデータ形式に保存しなおす、といったこともできます。読み出して他の形式に保存するプログラムの例は以下の記事でも紹介しています。
おまけの実験
tdmsファイルについておまけの実験をしてみました。
波形データをそのまま保存する場合
tdmsファイルでの保存について便利なのは、波形データをそのまま書き込みの関数に入力して保存できることです。
そこで、波形データとして書き込みを行った際に保存時間およびファイルサイズが変わるかどうかについて試してみました。
結果、かかった時間は変わらず、ファイルサイズも7,813 kBと変わりませんでした。
さらに多いデータを保存する場合
上の比較のプログラムで対象としていたシチュエーションとしては「100ミリ秒に一度10000のデータが得られこれを保存するという動作を100回繰り返す」というものでした。この方法で、tdmsファイル形式での保存ではキューがたまる状況は起きませんでした。
では、さらにデータを増やして「100ミリ秒に一度1000000(=1 M)のデータが得られこれを保存するという動作を100回繰り返す」という場合にはどうなるか?試してみました。100ミリ秒で扱うデータの数が100倍になっている、ということです。
結果的にはもちろん生成されるファイルサイズは大きくなるものの、プログラム中の保存に対する遅延は見られませんでした(キューがたまる状態は見られませんでした)。
プログラムを作るうえで、処理したデータをどのように保存するか考えることは大切です。ただ、プログラム全体のパフォーマンスを考えて処理が早くできるのに越したことはなく、その意味でバイナリファイルやtdmsファイルはテキストファイル系の保存形式と比べて活用できる場面が多いと思います。
tdmsファイルそのものは開ける環境に制限があるものの、データを取り終えてから後処理で他のデータ形式に変換することもできるので、データ取得中はとにかく速度を優先して、その後はゆっくり好みのデータ形式に変換するという方法がとれます。
本記事が、プログラム作りにおける保存形式の選択の参考になればうれしいです。
ここまで読んでいただきありがとうございました。
コメント