私は、並列CPUスレッドを使用してgzip(.gz)ファイルを生成することができます。つまり、個別に初期化されたz_stream
レコードを持つ入力ファイルから別々のチャンクを収縮させることになります。個別に圧縮されたチャンクからgzipストリームを作成する
従来のシングルスレッド操作では、結果ファイルはzlibのinflate()関数で読み取ることができます。
これは可能ですか?カスタマイズされたzlibコードが必要な場合でも?唯一の要件は、現在存在するzlibのinflateコードがそれを処理できることです。
更新
pigzソースコードは、それがどのように動作するかを示しています。いくつかの洗練された最適化を使用してチャンク間で辞書を共有し、圧縮率を最適に保ちます。より新しいzlibバージョンが使用されている場合は、さらにビットパッキングを処理します。
どのように私は自分自身をロールバックする方法を理解したい、最適化せずに物事をシンプルに保つことが好きですpigz
を使用します。
多くの場合、ソースコードは最終的なドキュメント(Ed Post, anyone?)であると考えていますが、誤解を避けるために、ソースコードを単純な言葉で説明しました。 (。ドキュメントは、実際にかなりよく何が起こるかを記載しているが、彼らは自分自身をロールするために何をすべきか、あまりにもうまく説明できない)
コードを閲覧から、私はこれまで多くを考え出し:
それZ_FINISH
の代わりに、deflate(..., Z_SYNC_FLUSH)
を使用して各圧縮チャンクを作成するだけです。しかし、deflateEnd()
はエラーを返し、無視できるかどうかはわかりません。最後にチェックサムを追加する方法は不思議ですが、手作業ですべてのチャンクに対する最終チェックサムを手動で計算する必要があります。また、gzipヘッダーを書くためのかなり複雑なput_trailer()
関数もあります。単純なケースのためにzlib自身のコードでも扱えるのだろうか?
これについての説明は理解できます。
また、マルチスレッド圧縮ファイルをzipアーカイブに書き込むために、同じ方法でzlibストリームを書き込むことを尋ねる必要があります。より複雑なgzipヘッダーがないため、より単純化が可能です。
私は自分のgzヘッダーとトレーラーを追加して、deflateを使用しようとしています。ビット4をwビットで設定すると、gzファイルは10バイトのヘッダ「1F 8B 08 00 00 00 00 00 03」で始まり、データ '95 58 7B 6F D3 48 ...'が収縮し、CRCで終わり、ソース長さここまでは順調ですね。ビット4がクリアされると、それは '78 DA'で始まり、次に同じデータ' 95 58 7B 6F D3 48 ... 'で始まり、チェックサム(Adler?)で終わります。最初の2バイトは何をしますか?ヘッダーを追加してCRCとoriglenを追加するだけで、.gzファイルとして解凍されません。ヘッダーとトレーラーなしで純粋なgzストリームを生成するにはどうすればよいですか? –
私はあなたが「生の収縮ストリームをどのように生成するのですか?ヘッダーと予告編がない場合は、定義上gzipまたは "gz"ストリームではありません。 zlib.hのドキュメントには、raw deflateストリームの作成方法が記載されています。 'deflateInit2()'に負の 'wbits'値を与えます。 –
zlibストリームの最初の2バイトは、それをzlibストリームとして識別し、圧縮方法とウィンドウサイズを提供します。最後に、Adler-32の値はビッグエンディアンの順序で格納されます。 (gzipラッパーとは異なり、トレーラーの値はリトルエンディアンの順番で格納されます) –