7

圧縮された zlib データを含む複数のバイナリ文字列がある場合、すべてを解凍せずにそれらを 1 つの圧縮文字列に効率的に結合する方法はありますか?

私が今しなければならないことの例:

c1 = zlib.compress("The quick brown fox jumped over the lazy dog. ")
c2 = zlib.compress("We ride at dawn! ")
c = zlib.compress(zlib.decompress(c1)+zlib.decompress(c2)) # Warning: Inefficient!

d1 = zlib.decompress(c1)
d2 = zlib.decompress(c2)
d = zlib.decompress(c)

assert d1+d2 == d # This will pass!

私が欲しいものの例:

c1 = zlib.compress("The quick brown fox jumped over the lazy dog. ")
c2 = zlib.compress("We ride at dawn! ")
c = magic_zlib_add(c1+c2) # Magical method of combining compressed streams

d1 = zlib.decompress(c1)
d2 = zlib.decompress(c2)
d = zlib.decompress(c)

assert d1+d2 == d # This should pass!

私は zlib と DEFLATE アルゴリズムについてあまり詳しくないので、これは理論的な観点からは完全に不可能かもしれません。また、use zlib を使用する必要があります。そのため、zlib をラップして、連結されたストリームを透過的に処理する独自のプロトコルを考え出すことはできません。

注: 解決策が Python で簡単でなくてもかまいません。C コードを書いて、Python で ctypes を使用したいと考えています。

4

3 に答える 3

7

C に挑戦することを気にしないので、gzjoinのコードを見ることから始めることができます。

gzjoinコードは、マージ時に変更する必要がある部分を見つけるために解凍する必要がありますが、再圧縮する必要はありません。通常、解凍は圧縮よりも高速であるため、それほど悪くはありません。

于 2013-02-07T06:13:31.887 に答える
5

最初のデフレートストリームの解凍を必要とするgzjoinに加えて、gzlog.hgzlog.cを見ることができます。これらは、毎回デフレートストリームを解凍することなく、短い文字列をgzipファイルに効率的に追加します。(gzipでラップされたdeflateデータの代わりにzlibでラップされたdeflateデータを操作するように簡単に変更できます。)最初のdeflateストリームの作成を制御している場合は、このアプローチを使用します。最初のデフレートストリームを作成していない場合は、解凍が必要なgzjoinのアプローチを使用する必要があります。

どのアプローチも再圧縮を必要としません。

于 2013-02-07T16:34:19.003 に答える