2 つ以上の gzip ストリームを再圧縮せずに連結したい。
つまり、A を A.gz に圧縮し、B を B.gz に圧縮しました。C または C++ を使用して、もう一度圧縮せずにそれらを単一の gzip (A+B).gz に圧縮したいと考えています。
いくつかのメモ:
- 2 つのファイルを連結するだけで、gunzip はそれらの処理方法を知っていても、ほとんどのプログラムは 2 つのチャンクを処理できません。
- ファイルを解凍してから元のファイルを操作するだけでこれを行うコードの例を一度見たことがありますが、これは通常の再圧縮よりもはるかに高速ですが、それでも O(n) CPU 操作が必要です。
- 残念ながら、私が一度見つけたこの例 (解凍のみを使用した連結) を見つけることができません。
注:提案されたソリューションは私のニーズに合わないため、これは重複していません。
清算編集:
いくつかの圧縮された HTML pices を連結し、それらを 1 つのページとしてブラウザーに送信したい: "Accept-Encoding: gzip"、応答は "Content-Encoding: gzip"
ストリームが のように単純に連結されている場合cat a.gz b.gz >ab.gz
、Gecko (firefox) および KHTML Web エンジンは最初の部分 (a) のみを取得します。IE6 では何も表示されず、Google Chrome では最初の部分 (a) が正しく表示され、2 番目の部分 (b) はガベージとして表示されます (まったく解凍されません)。
これをうまく処理できるのは Opera だけです。
したがって、いくつかのチャンクからなる単一のgzip ストリームを作成し、再圧縮せずに送信する必要があります。
更新: zlib の例でgzjoin.cを見つけました。解凍のみを使用して実行します。問題は、解凍がまだ遅いということmemcpy
です。
最速の gzip 圧縮よりも 4 倍高速です。しかし、それだけでは十分ではありません。
必要なのは、解凍手順を実行しないために gzip ファイルと一緒に保存する必要があるデータを見つけることと、圧縮中にこのデータを見つける方法です。