圧縮APIの使用

多くのアプリケーションでは、無損失のデータ圧縮と圧縮解除を使用する必要があります。 圧縮APIは、パブリックAPIを介してWindows圧縮アルゴリズムを公開することで、これを簡略化します。 各圧縮アルゴリズムには、その動作を制御する一連のプロパティがあります。 圧縮APIは、開発者がこれらのプロパティの値を設定または照会できるようにするインターフェイスを公開します。 サポートされている圧縮アルゴリズムのすべてのプロパティには、これらのプロパティの一般的に使用される値を表す既定値があります。 圧縮と圧縮解除の両方にプロパティが必要な場合、既定値は同じになり、圧縮と圧縮解除に同じ値が使用されます。

圧縮アルゴリズムの選択

アプリケーションでデータを圧縮または圧縮解除する必要があると開発者が判断したら、次の手順で圧縮アルゴリズムを選択します。 これは、特定のアプリケーションの速度、圧縮率、メモリ要件の最適な組み合わせを見つけるためのテストに依存する場合があります。 次の一覧は、圧縮APIで現在サポートされている圧縮アルゴリズムの相対的な比較を示しています。 すべての圧縮アルゴリズムですべてのオプションを使用できるわけではありません。また、パフォーマンスは入力データに依存する可能性があるため、比較は概算です。

XPRESS (COMPRESS_ALGORITHM_XPRESS)

  • リソース要件が低く、非常に高速
  • 中程度の圧縮率
  • 高い圧縮速度と圧縮解除速度
  • 低いメモリ要件
  • COMPRESS_INFORMATION_CLASS列挙体で使用できるCOMPRESS_INFORMATION_CLASS_LEVELオプションをサポートします。 既定値は (DWORD) 0です。 一部のデータでは、値 (DWORD) 1を指定すると圧縮率が向上し、圧縮速度が若干遅くなります。

Huffmanエンコードを使用したXPRESS (COMPRESS_ALGORITHM_XPRESS_HUFF)

  • 圧縮率はCOMPRESS_ALGORITHM_XPRESSよりも高いです
  • 中程度の圧縮率
  • 中~高の圧縮および解凍速度
  • 低いメモリ要件
  • COMPRESS_INFORMATION_CLASS列挙体で使用できるCOMPRESS_INFORMATION_CLASS_LEVELオプションをサポートします。 既定値は (DWORD) 0です。 一部のデータでは、値 (DWORD) 1を指定すると圧縮率が向上し、圧縮速度が若干遅くなります。

MSZIP (COMPRESS_ALGORITHM_MSZIP)

  • COMPRESS_ALGORITHM_XPRESS_HUFFよりも多くのリソースを使用します
  • RFC 1951と同様の圧縮ブロックを生成します。
  • 中~高圧縮率
  • 中程度の圧縮速度と高伸長速度
  • 中程度のメモリ要件

LZMS (COMPRESS_ALGORITHM_LZMS)

  • 圧縮するデータのサイズが2MBを超える場合に適したアルゴリズムです。
  • 高圧縮率
  • 低い圧縮速度と高い解凍速度
  • 中~高のメモリ要件
  • COMPRESS_INFORMATION_CLASS列挙体で使用できるCOMPRESS_INFORMATION_CLASS_BLOCK_SIZEオプションをサポートします。 圧縮率を高めるには、最小サイズを1 MBにすることをお勧めします。

使用する圧縮APIモードの決定

開発者が圧縮アルゴリズムを選択したら、次に使用する圧縮APIの2つのモード (バッファーモードとブロックモード) を決定します。 バッファーモードは使いやすいように開発されており、ほとんどの場合に推奨されます。

バッファーモードは、選択した圧縮アルゴリズムに適したサイズのブロックに入力バッファーを自動的に分割します。 バッファーモードでは、圧縮されていないバッファーサイズが自動的に書式設定され、圧縮バッファーに格納されます。 圧縮バッファーのサイズは自動的に保存されないため、アプリケーションで圧縮解除用に保存する必要があります。 バッファーモードを使用するためにCreateCompressorCreateDecompressorを呼び出す場合は、AlgorithmパラメーターにCOMPRESS_RAWフラグを含めないでください。 バッファーモードアプリケーションのコード例については、 「バッファーモードでの圧縮APIの使用」 セクションを参照してください。

ブロックモードでは、開発者はブロックサイズを制御できますが、アプリケーションで実行する必要がある作業が増えます。 ブロックモードを使用する場合、アプリケーションは、圧縮時に入力データを適切なサイズの部分に分割し、圧縮解除時にそれらをまとめて戻す必要があります。 入力バッファーのサイズが圧縮アルゴリズムの内部ブロックサイズよりも大きい場合、ブロックモードは失敗します。 内部ブロックサイズは、MSZIPでは32KB、XPRESS圧縮アルゴリズムでは1GBです。 LZMSの内部ブロックサイズは最大64GBまで構成でき、それに応じてメモリ使用量が増加します。 圧縮バッファーのサイズは自動的に保存されず、アプリケーションでは圧縮解除のためにこれを保存する必要もあります。 DecompressUncompressedBufferSize パラメーターの値は、出力バッファーのサイズだけでなく、圧縮されていないデータの元のサイズと正確に一致する必要があります。 つまり、アプリケーションは、ブロックモードを使用するときに、圧縮されていないデータの正確な元のサイズと、圧縮されたデータと圧縮されたサイズを保存する必要があります。 ブロックモードを使用するためにCreateCompressorCreateDecompressorの両方を呼び出す場合は、AlgorithmパラメーターにCOMPRESS_RAWフラグを含めます。 ブロックモードアプリケーションのコード例については、 「ブロックモードでの圧縮APIの使用」 セクションを参照してください。

カスタムメモリ割り当て

バッファーアプリケーションとブロックモードアプリケーションには、CreateCompressorCreateDecompressorを呼び出すときにカスタムメモリ割り当てルーチンを指定するオプションがあります。 AllocationRoutinesパラメーターは、メモリ割り当てルーチンを含むCOMPRESS_ALLOCATION_ROUTINES構造体を指定します。 アプリケーションは、SetCompressorInformationを使用して、コンプレッサーのブロックサイズを設定できます。 単純なカスタマイズされた割り当てルーチンの例については、 「ブロックモードでの圧縮APIの使用」 セクションを参照してください。