LabVIEW

cancel
Showing results for 
Search instead for 
Did you mean: 

バイナリデータの読み込み

はじめまして。

 

今回、バイナリデータとして書き出された計測データをLabviewで読み込み解析しようと考えています。

バイナリデータ内には、SGL、I32、U64等様々な形式で記述されているようです。

 

関数"バイナリファイルから読み取る"を利用しようと考えたのですが、うまくいきませんでした。。

また、計測ファイルのデータ容量が非常に大きく(300MBほど)、上記関数の詳細ヘルプ内にある

サンプル"Read Binary File VI"を利用したところ、"メモリが一杯です"とのコメントが表示されました。

 

これまで、テキストファイルのみを扱ってきたので、現在お手上げの状況です。。

 

拙い説明で申し訳ございませんが、何卒アドバイスの方よろしくお願い致します。

0 Kudos
Message 1 of 6
(7,430 Views)

> バイナリデータ内には、SGL、I32、U64等様々な形式で記述されているようです。

とございますが、ひとつのファイル内にSGLI32U64の値が混在しているということでしょうか?

 

また、

> サンプル"Read Binary File VI"を利用したところ、"メモリが一杯です"とのコメントが表示されました。

とのことですが、これは、上記のVIが、ファイル内のデータを一度に全て読み取ろうとしているために生じるものです。

上記のVIでは、「ファイルサイズを取得」関数にてファイルサイズを取得した後、それを8 (ひとつのDBL値を表すバイト数) で割ったものを、「バイナリファイルから読み取る」関数の「カウント」端子に入力しています。

これは、ファイル内のバイナリデータを全てDBLの値とし、全てのデータを一括して読み取る (メモリ上にロードする) ことを意味します。

今回、バイナリファイルサイズが大きいため、結果として、メモリ不足のエラーが生じます。

 

メモリ不足のエラーを回避するには、全てのデータを一括して読み取るのではなく、上記の「カウント」端子に適切な値を入力いただき、分割して読み取る処理が必要となります。

0 Kudos
Message 2 of 6
(7,377 Views)

n.hayata

 

返信ありがとうございます.

 

>> バイナリデータ内には、SGL、I32、U64等様々な形式で記述されているようです。

>とございますが、ひとつのファイル内にSGL、I32、U64の値が混在しているということでしょうか?

 

その通りです。下記のようにデータのタイプ及びサイズの異なるデータが記述されています。

 

Type         Size

SGL                4

Enum(U16)      2

Enum(U16)      2

 

Enum(U16)      2

String           101

String             53

   ・        ・

  ・         ・

 

 

欲しい情報(計測データ)は、Int16で書かれているようです。

また、1つの計測データに対して、ヘッダーが一つあり、

ファイルヘッダーの後に、計測データに対するヘッダー、計測データが交互に並んでいる構成のようです。

 

ファイルヘッダーの必要な部分、及び計測データのみを読み込み、10進数変換して扱いたいと考えております。。。

 

このように部分部分を抽出することは可能なのでしょうか?

可能である場合、御返信にありました「カウント」端子には、どのような入力をすればよいのでしょうか?

 

大変お手数ですが、アドバイスを頂けると幸いです。

0 Kudos
Message 3 of 6
(7,368 Views)

フォーマットは既知なのですね。

でしたら、例えば、添付のスクリーンショットのように、フォーマットに従って各フィールドを順に読み取る方法が考えられます。

0 Kudos
Message 4 of 6
(7,344 Views)

n.hayata

 

御返信ありがとうございます。

 

添付いただいた資料をもとに、読み込みを試みたのですが、上手くいかず疑問点がいくつか出てきました。

 

1) 例えば1つ目のSGL形式、サイズ4の読み込み関数からは、4つの整数が出力されます。

読み込むべきデータは1つの整数のはずですが。。読み込んだ後に何か変換する必要があるのでしょうか?

 

2)文字列の読み込みを行おうとすると"メモリが足りない"という

エラーが起こってしまいます。。。

 

 

素人の的を得ていない質問かもしれませんが、アドバイスを頂けると幸いです。

0 Kudos
Message 5 of 6
(7,322 Views)

例えば、

 

Type         Size

SGL                4

 

というのは、単精度浮動小数点の数値が4つ、ということではなく、4バイトの単精度浮動小数点の数値が1つ、ということだったのでしょうか。

私は、前者のつもりで回答をしていました。

前回の回答で示したスクリーンショットでは、例えば、一つ目の「バイナリファイルから読み取る」関数は、4バイトの単精度浮動小数点の数値を4つ読み取る、すなわち、16バイトのデータを読み取る、という処理を行います。

そのため、4つの単精度浮動小数点の数値が配列で返されることとなります。

 

 

また、「メモリが足りない」エラーが出ているとのことですが、どこかの箇所で、過度に大量のデータを一度に読み取ろうとしていることが原因かと考えられます。

例えば、下のスクリーンショットのような実装ですと、各ステップで読み取られるデータは限定的なものとなりますので、メモリが足りない旨のエラーは生じないはずです。

2604917_snipet.png

(参考: VIスニペットで再利用を促進 - National Instruments https://knowledge.ni.com/KnowledgeArticleDetails?id=kA03q000000x2PkCAI&l=ja-JP)

0 Kudos
Message 6 of 6
(7,262 Views)