データとキーの圧縮

ファイルハンドラを使用して作成したファイルのレコードとキーは圧縮することができるので、物理的なディスク領域の占有が少なくてすみます。 ファイルハンドラを使用してプログラムから圧縮ルーチンを呼び出して、データ圧縮を行うことができます。

データ圧縮

データ圧縮では、レコード順ファイルまたは索引ファイルのデータを圧縮することができます。 この COBOL システムでは 2 つの圧縮機構があります。ランレングスエンコーデング (タイプ 1) と拡張ランレングスエンコーデング (タイプ 3) です。

ファイルをランレングスエンコーデングで定義すると、繰り返される任意の文字列は 1 文字として格納されます。

DATACOMPRESS コンパイラ指令でデータ圧縮を実行できます。

固定長構造の順ファイルにデータ圧縮を指定すると、可変長構造の順ファイルに変換されます。 ファイル構造の詳細については、ヘルプトピック  『ファイル構造』を参照してください。

ファイルのデータ圧縮は、そのファイルに対する SELECT 文の処理時に最後に処理された DATACOMPRESS 指令で決定されます。 そのため、次のような形式の行を記述することで、データ圧縮タイプを個々のファイルについて指定できます。

$SET DATACOMPRESS

これは、SELECT 文の直前に記述します。別のファイルを処理する前に $SET NODATACOMPRESS で圧縮を解除することを忘れないでください。

DATACOMPRESS コンパイラ指令の詳細については、ヘルプトピック  『DATACOMPRESS』を参照してください。

注: 圧縮された順ファイルに REWRITE 文を使用することはお奨めしません。 REWRITE 処理が成功するのは、圧縮された新しいレコードの長さが圧縮された古いレコードの長さと同じ場合のみです。

キー圧縮

キー圧縮は、索引ファイルのキーに適用できる技術です。 キー圧縮には、次の 4 種類があります。

ファイルハンドラ構成ファイルの KEYCOMPRESS オプションでキー圧縮を指定できます。 圧縮の種類を示す次の整数を使用して指定します。

1 重複キーの圧縮
2 先頭文字の圧縮
4 後続空白文字の圧縮
8 後続ヌル文字の圧縮

これらの数字をいくつかまとめて追加すると、圧縮の種類を組み合わせて使用できます (ただし、相互排他的な後続ヌル文字と後続空白文字は一緒に指定できません)。

また、プログラムをコンパイルするときに、KEYCOMPRESS コンパイラ指令を使用することもできます

ファイルのキー圧縮は、そのファイルに対する SELECT 文の処理時に最後に処理された KEYCOMPRESS 指令で決定されます。そのため、プログラムで次のような形式の行を記述すると、個々のファイルのデータ圧縮を指定できます。

$SET KEYCOMPRESS"8"

この行はプログラムの SELECT 文の直前に記述してください。他のファイルを処理する前に、$SET NOKEYCOMPRESS を指定すると、キー圧縮を解除できます。

KEYCOMPRESS コンパイラ指令の詳細については、ヘルプトピック  『KEYCOMPRESS』を参照してください。

後続ヌル文字の圧縮

キーに後続ヌル文字の圧縮を定義すると、キー値の後続ヌル文字はファイルに格納されません。

たとえば、30 文字の長さの主キーまたは副キーの最初の 10 文字のみを使用し、残りがヌル文字であるレコードを書き込むとします。圧縮をしない場合は、キーの 30 文字すべてが格納されるため、30 バイトが必要になります。後続ヌル文字の圧縮を行うと、11 バイトのみですみます (10 バイトを最初の 10 文字用に、1 バイトを後続ヌル文字用に使用します)。

後続の空白文字の圧縮

キーに後続空白文字の圧縮を定義すると、キー値の後続空白文字はファイルに格納されません。 情報は格納されるので、キーは適切に配置されます。

たとえば、30 文字の長さの主キーまたは副キーで最初の 10 文字のみを使用し、残りが空白文字であるレコードを書き込むとします。圧縮をしない場合は、キーの 30 文字すべてが格納されます。 後続空白文字の圧縮を行うと、索引ファイルの 11 バイトを占有するのみですみます (10 バイトを最初の 10 文字用に、1 バイトを後続空白文字用に使用します)。

先頭文字の圧縮

キーに先頭文字の圧縮を定義すると、前のキーの先頭文字と一致する先頭文字はすべて索引ファイルに格納されません。 情報は格納されるので、キーを適切に再構築できます。

たとえば、先頭文字を圧縮するようにキーを定義し、次のようなキー値のあるレコードを書き込むとします。

AXYZBBB BBCDEFG BBCXYZA BBCXYEF BEFGHIJ CABCDEF

索引ファイルに実際に格納されるキーは、次のようになります。

AXYZBBB BBCDEFG XYZA    EF      EFGHIJ  CABCDEF

重複キーの圧縮

副キーに重複キーの圧縮を定義すると、最初の重複キーのみがファイルに含められます。 残りは格納されませんが、情報は格納されるので、キーは正しく再構築できます。

たとえば、"ABC" という副キー値をもつレコードを書き込むとします。重複キーの圧縮を有効化し、同じキー値を持つ別のレコードを書き込んだ場合には、ファイルハンドラは重複キー値を物理的に索引ファイルに格納しません。 ただし、レコードはなおも副キーパスで使用可能です。

データ圧縮とキー圧縮の例

次のプログラムでは、transfile にデータ圧縮を指定します。masterfile に対してはデータ圧縮を指定しません。キー圧縮については、キー t-rec-keym-rec-key に対して前のキーと同じ後続空白と先行文字の抑制を指定します。m-alt-key-1m-alt-key-2 に対しては重複キーの繰り返しも抑制します。

$set callfh"extfh"
$set datacompress"1"
$set keycompress"6"
     select transfile
         assign to ... 
         key is t-rec-key. 
$set nokeycompress
$set nodatacompress
     select masterfile
         assign to ... 
         organization is indexed
$set keycompress"6"
         record key is m-rec-key 
$set keycompress"7"
         alternate key is m-alt-key-1 with duplicates
         alternate key is m-alt-key-2.
$set nokeycompress

圧縮ルーチン

ファイルハンドラがデータを圧縮するために使用するルーチンは、スタンドアロンモジュールです。 このため、この圧縮ルーチンをアプリケーションで使用することができます。また、独自に作成したデータ圧縮ルーチンをファイルハンドラで使用することができます。

Micro Focus の圧縮ルーチンとユーザ独自の圧縮ルーチンは、どちらも最大 127 個まで使用できます。

Micro Focus 圧縮ルーチン

Micro Focus のルーチンは、CBLDCnnn というモジュールに格納されています。nnn は 001~127 の 数字です。Micro Focus の圧縮ルーチンを使用するには、FCD の fcd-data-compress に 001~127 の値を設定します。

Micro Focus 圧縮ルーチン CBLDC001 および CBLDC101

圧縮ルーチン CBLDC001 と CBLDC101 では、ランレングスエンコーディング (RLC) 形式を使用します。RLC は、同じ文字の文字列 (実行) を検出し、その文字列を文字の識別子、カウントまたは 1 つのオカレンスとして減らす圧縮方法です。

注:2 バイト文字 (2 バイトの空白文字を含む) は圧縮されないため、これらのルーチンは 2 バイトのオカレンスを格納するファイルでは無効です。

CBLDC001 と CBLDC101は、特に空白文字、バイナリのゼロと文字のゼロ (1 文字に減らすことができる)、印刷可能文字 (カウント数とその後に続く反復文字の計 2 文字に減らすことができる) に対して実行することを目的としています。

CBLDC001 と CBLDC101 の違いは、CBLDC101 が 256 KB までの長さの文字列を処理できる一方で、CBLDC001 は 65535 バイトまでの文字列しか処理できないということです。

圧縮ファイルでは、バイトは次の意味を持っています(16 進値表示)。

20-7F ほとんどの印刷可能な文字。通常の ASCII 文字です。
80-9F それぞれ 1~32 文字までの空白文字
A0-BF それぞれ 1~32 文字までのバイナリのゼロ
C0-DF それぞれ 1~32 文字までの文字のゼロ
E0-FF 後に続く文字の 1~32 回までのオカレンス数
00-1F 後に続く文字の 1~32 回までのオカレンス数。圧縮コードとしてではなく、文字どおり解釈します。

元のデータに 00-1F、80-9F、A0-BF、C0-DF、E0-FF のどちらかの範囲の文字が存在するときに使用されます。(このような文字の 1 文字は 2 バイトに拡張されます。それ以外の場合には、圧縮により発生する弊害はありません。)

Micro Focus 圧縮ルーチン CBLDC003 および CBLDC103

CBLDC001 と CBLDC101 同様、これらのルーチンではランレングスエンコーディング (RLC) を使用しますが、1 バイトと 2 バイトの文字列 (実行) を検出します。これらのルーチンは DBCS 文字に適していますが、CBLDC001 のかわりに使用することもできます。

CBLDC003 と CBLDC103 の違いは、CBLDC103 が256 KB までの長さの文字列を処理できる一方で、CBLDC003 は 65535 バイトまでの文字列しか処理できないということです。

圧縮形式は、ヘッダーバイト 2 個の後に 1 つ以上の文字が続きます。ヘッダーバイトのビットの内容は次のとおりです。

ビット 15 設定解除 - 1 文字
ビット 14 設定 - 圧縮シーケンス 設定解除 - 非圧縮シーケンス
ビット 0~13 圧縮した文字または圧縮しない文字数

文字列の長さはヘッダーのビットによって異なります。

ビット 14 および 15 を設定した場合 2 つの反復文字
ビット 14 のみを設定した場合 1 つの反復文字
その他 1~63 文字までの非圧縮文字

Micro Focus の圧縮ルーチンの呼び出し

データファイルを圧縮する場合には、ファイルハンドラは DATACOMPRESS コンパイラ指令で指定する圧縮ルーチンを呼び出します。

Micro Focus の圧縮ルーチンを呼び出すには、次の構文を使用します。

COBOL:
call "CBLDCnnn" using input-buffer,
input-buffer-size,
output-buffer,
output-buffer-size,
compression-type
        
C:
cbldcnnn(input_buffer, &input_buffer_size,  
         output_buffer, &output_buffer_size,
&compression-type);

ルーチン CBLDC001 と CBLDC003 のパラメータの内容は、次のとおりです。

nnn 001~127 のデータ圧縮ルーチン。
input_buffer PIC X(サイズ) データ項目。 ルーチンの入口で圧縮または圧縮解除するデータを記述する必要があります。最大サイズは 65,535 バイトです。
input_buffer_size 2 バイトの (C では int、COBOL では PIC XX COMP-5) データ項目。 入口で入力バッファのデータ長を記述する必要があります。
output_buffer PIC X(サイズ) データ項目。 終了時に、結果データを格納します。
output_buffer_size 2 バイトの (C では int、COBOL では PIC XX COMP-5) データ項目。 入口で使用可能な出力バッファのサイズを記述する必要があり、終了時にはバッファのデータ長を格納します。
compression-type 1 バイトの (C では char、COBOL では PIC X COMP-X) データ項目。 入口で入力データを圧縮するか圧縮解除するかを指定する必要があります。

0 - 圧縮、1 - 圧縮解除

ルーチン CBLDC101 と CBLDC103 のパラメータの内容、次のとおりです。

nnn 001~127 のデータ圧縮ルーチン。
input_buffer PIC X(サイズ) データ項目。 ルーチンの入口で、圧縮または圧縮解除するデータを記述する必要があります。最大サイズは 256 バイトです。
input_buffer_size 4 バイトの (C では int、COBOL では PIC XXXX COMP-5) データ項目。 入口で入力バッファのデータ長を記述する必要があります。
output_buffer PIC X(サイズ) データ項目。 終了時に、結果データを格納します。
output_buffer_size 4 バイトの (C では int、COBOL では PIC XXXX COMP-5) データ項目。 入口で使用可能な出力バッファのサイズを記述する必要があり、終了時にはバッファのデータ長を格納します。
compression-type 1 バイトの (C では char、COBOL では PIC X COMP-X) データ項目。 入口で入力データを圧縮するか圧縮解除するかを指定する必要があります。

0 - 圧縮、1 - 圧縮解除

RETURN-CODE 特殊レジスタは、操作が成功したかどうかを示します。圧縮または圧縮解除は、出力バッファが小さく結果を受け付けられない場合のみに失敗します。 0 は成功、1 は失敗を示します。

ユーザ独自の圧縮ルーチン

ユーザ独自の圧縮ルーチンは、USRDCnnn というモジュールに格納する必要があります。nnn は 128~255 までの数字です。

ユーザ独自のルーチンを呼び出すには、Micro Focus のルーチンを呼び出すのと同じ構文で、CBLDCnnnの代わりに、ファイル名 USRDCnnn を使用します。nnn は 128~255 までの数字です。

圧縮ルーチンをシステムで使用するには、必要なときに呼び出せる共有オブジェクトを作成する必要があります。

cob オプションを使用して、前の UNIX COBOL システムからのプログラムのデータ圧縮ルーチンの呼び出しを、新しい呼び出しへマップできます。次のように記述します。

-m CBL_DATA_COMPRESS_nnn=CBLDCnnn
        

注:

関連情報
はじめに
ファイル編成
ファイル名
ファイル状態
ファイルの共有
ファイルハンドラの構成
ファイルハンドラおよびソート API
ファイル操作のトレース