データログ関数を調べる

前回の NI-SCOPE 関連で波形の保存をしたところ非常に遅く、書き込みにはデータログ関数が使われている事が分かりました。

この関数が遅いのか?と思い調べてみました。

データログとは何か?

よく分かりません。関数の説明は LabVIEW ヘルプには書かれていますが、データログをどういう時にどういう用途で使用するのかは書かれていません。

コードを動かしてみて調べたところでは、指定したデータタイプを保存するバイナリシリアライザのようです。

ファイル内のデータは "レコード" 単位で管理され、10ヶのデータを書き込むと 10レコードが書かれ、読み込みの際に 10 レコードが読み込まれます。

書き込み用のコードと結果

書き込みベンチマークは以下のコードで生成。

データ数で指定した個数分 I32 配列を書き込むだけです。

clip_image001

で、結果は以下の通り。

こちらのようにファイル関数を使った 4088.54MB/sec には遠く及びませんが、それなりの数値が出ています。

clip_image002

波形を書いてみる

波形も書いてみました。とりあえずは定数で作ったものを入れてみます。

clip_image003

うん。これは遅い。

テスト方法が間違っているのかもしれないですが、最高でも 4.8244MB/sec とはこれいかに。

clip_image004

読み込み用のコードと結果

こちらが読み込みのコード。データログファイルを開いたらレコード数を取得し、その個数分 for を回しています。

で、結果は 3150.24 MB/sec。普通のバイナリ書き込みには及びませんが、早いですね。

clip_image005

clip_image006

波形の読み込みは割愛。

どういうときに使うのか?

このデータログ形式ですが、どういう時に使うのが良いのでしょうか?

レコード数を取得できる

まずファイル読み込み前にレコード数を取得できるのはアドバンデージの一つですね。シーケンシャルに書き込んだバイナリ書き込みでは、読み込んでみないと格納されているデータ個数が分かりません。

読み込む前にデータ数を知りたい場合には良いんじゃないでしょうか。

データタイプは諸刃の剣か?

おそらくどんな構造のデータでもバイナリ形式に変換して書き込んでくれるデータログ形式。

簡単で良いのですが、元のデータ構造が変わってしまったら読むことが出来なくなってしまうのではないでしょうか?

作っていたソフトをバージョンアップしてデータ構造を変えたら、古いバージョンで書き込んだデータが読めなくなってしまった。という事がないようにデータ構造は正しく管理する必要がありそうです。

まとめ

  • バイナリ書き込みに比べて低速の書き込みです
  • 読み込みはバイナリファイルよりは遅いですが、許容範囲と思われます。
  • ファイル内のデータ個数(レコード数) を取得できるのは良い機能です。
  • さまざまなデータタイプを保存出来ますが、読み込み時は同じデータタイプにしないといけないと思います(未確認)

コメント