10-29-2013 03:54 AM
はじめまして。
今回、バイナリデータとして書き出された計測データをLabviewで読み込み解析しようと考えています。
バイナリデータ内には、SGL、I32、U64等様々な形式で記述されているようです。
関数"バイナリファイルから読み取る"を利用しようと考えたのですが、うまくいきませんでした。。
また、計測ファイルのデータ容量が非常に大きく(300MBほど)、上記関数の詳細ヘルプ内にある
サンプル"Read Binary File VI"を利用したところ、"メモリが一杯です"とのコメントが表示されました。
これまで、テキストファイルのみを扱ってきたので、現在お手上げの状況です。。
拙い説明で申し訳ございませんが、何卒アドバイスの方よろしくお願い致します。
10-31-2013 07:36 PM
> バイナリデータ内には、SGL、I32、U64等様々な形式で記述されているようです。
とございますが、ひとつのファイル内にSGL、I32、U64の値が混在しているということでしょうか?
また、
> サンプル"Read Binary File VI"を利用したところ、"メモリが一杯です"とのコメントが表示されました。
とのことですが、これは、上記のVIが、ファイル内のデータを一度に全て読み取ろうとしているために生じるものです。
上記のVIでは、「ファイルサイズを取得」関数にてファイルサイズを取得した後、それを8 (ひとつのDBL値を表すバイト数) で割ったものを、「バイナリファイルから読み取る」関数の「カウント」端子に入力しています。
これは、ファイル内のバイナリデータを全てDBLの値とし、全てのデータを一括して読み取る (メモリ上にロードする) ことを意味します。
今回、バイナリファイルサイズが大きいため、結果として、メモリ不足のエラーが生じます。
メモリ不足のエラーを回避するには、全てのデータを一括して読み取るのではなく、上記の「カウント」端子に適切な値を入力いただき、分割して読み取る処理が必要となります。
11-01-2013 01:21 AM
返信ありがとうございます.
>> バイナリデータ内には、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進数変換して扱いたいと考えております。。。
このように部分部分を抽出することは可能なのでしょうか?
可能である場合、御返信にありました「カウント」端子には、どのような入力をすればよいのでしょうか?
大変お手数ですが、アドバイスを頂けると幸いです。
11-04-2013 06:43 PM
フォーマットは既知なのですね。
でしたら、例えば、添付のスクリーンショットのように、フォーマットに従って各フィールドを順に読み取る方法が考えられます。
11-07-2013 02:54 AM
御返信ありがとうございます。
添付いただいた資料をもとに、読み込みを試みたのですが、上手くいかず疑問点がいくつか出てきました。
1) 例えば1つ目のSGL形式、サイズ4の読み込み関数からは、4つの整数が出力されます。
読み込むべきデータは1つの整数のはずですが。。読み込んだ後に何か変換する必要があるのでしょうか?
2)文字列の読み込みを行おうとすると"メモリが足りない"という
エラーが起こってしまいます。。。
素人の的を得ていない質問かもしれませんが、アドバイスを頂けると幸いです。
11-26-2013
11:22 PM
- last edited on
05-06-2025
10:06 AM
by
Content Cleaner
例えば、
Type Size
SGL 4
というのは、単精度浮動小数点の数値が4つ、ということではなく、4バイトの単精度浮動小数点の数値が1つ、ということだったのでしょうか。
私は、前者のつもりで回答をしていました。
前回の回答で示したスクリーンショットでは、例えば、一つ目の「バイナリファイルから読み取る」関数は、4バイトの単精度浮動小数点の数値を4つ読み取る、すなわち、16バイトのデータを読み取る、という処理を行います。
そのため、4つの単精度浮動小数点の数値が配列で返されることとなります。
また、「メモリが足りない」エラーが出ているとのことですが、どこかの箇所で、過度に大量のデータを一度に読み取ろうとしていることが原因かと考えられます。
例えば、下のスクリーンショットのような実装ですと、各ステップで読み取られるデータは限定的なものとなりますので、メモリが足りない旨のエラーは生じないはずです。
(参考: VIスニペットで再利用を促進 - National Instruments https://knowledge.ni.com/KnowledgeArticleDetails?id=kA03q000000x2PkCAI&l=ja-JP)