はじめに
HULFTの送信定義において、バイナリファイルを圧縮する場合、圧縮単位という設定値を設定しないといけないが1、設定内容によっては送信エラーが発生する場合がある。
私が確認したのはHULFTのバージョン8でしたが、7でも同様かと思われます。
HULFTの圧縮
HULFTの圧縮方式には、
- 縦圧縮
- 縦横圧縮
- DEFLATE圧縮
の3種類があるが、DEFLATE圧縮については、HULFTのバージョン8以上でないと使用できない。
バージョン7との伝送で圧縮するためには、縦圧縮か横圧縮の設定が必要。
縦圧縮、横圧縮については、レコード単位に圧縮する処理なので、バイナリ伝送の場合はどのバイト長を1レコードとして扱うかを指定しないといけない。
その指定するパラメータが圧縮単位。
圧縮単位
圧縮単位は、0~32760 の範囲で設定可能。
マニュアルによると、
https://www.hulft.com/help/ja-jp/HULFT-V8/UX-OPE/Content/HULFT_OPE_UNIX/HULFTSysMngmntInfo/SndMngmntInfo.htm
値が大きいほど、高速に処理を行います(ただし、メモリを消費します)。
とのこと。
なので、圧縮効率を最大化するため、最大値(32760)を設定設定するのが良いのではと判断してしまう。
32Kバイトは大きな値ではないし、メモリ消費についても、最近の機器スペックからすると桁が違うので
問題になることはほぼないと考えられるので。
送信可能な最大レコード長
一方、HULFTには送信可能な最大レコード長があり、そのサイズは 32768 となっている(改行含む)。
圧縮においては、圧縮されたデータに制御情報が付加されて転送されるが、圧縮の効果がほぼなかった場合は、制御情報が付加されることで、元データよりもサイズが大きくなる場合がある。
そのため、圧縮単位を設定可能な最大値のような大きな値に設定していると、圧縮データによっては最大レコード長超過となり以下のエラーが発生する。
231 The data length of one record exceeds the maximum value.
内容)
1レコードのデータ長が最大値を超えました。対処)
圧縮により、1レコードの最大値32768バイトを超えたと考えられます。圧縮を行わないで配信を再実行してください。
推奨値
圧縮単位については、メーカの推奨値(圧縮データの圧縮効率がどれだけ悪くとも、送信データが最大レコード長を超過することがない値の最大値)があり、以下の値となっている。
32255
そのため、バイナリ伝送で圧縮単位を設定する場合は、32255 を設定するのが推奨されている。
できれば、マニュアルにその旨記載もしくは、圧縮単位の設定可能上限を 32255 にていただけると、大変ありがたいです。
終わりに
HULFTに精通している方なら自明のことなのかもしれないですが、製品のマニュアルにはどこにも記載がないので記事にしました。
バイナリ伝送の圧縮については、ファイルそのものを事前に別途圧縮した上でHULFTでは圧縮しないでおくか、バージョン8同士であるなら DEFLATE圧縮にするのがいいのかもしれないです。
参考
-
正確には、縦圧縮、縦横圧縮の場合のみ。DEFLATE圧縮の場合は設定不要 ↩