4

最近、期限切れになりそうな大学のホームディレクトリを、tarストリームとして送信し、自分の側で圧縮することでバックアップしましたssh user@host "tar cf - my_dir/" | bzip2 > uni_backup.tar.bz2

これは私に考えさせられました:私は圧縮がどのように機能するかの基本を知っているだけですが、アルゴリズムがデータのブロックの処理をある時点で終了する必要があるため、データのストリームを圧縮するこの機能は圧縮率の低下につながると思います、これを書いてください出力ストリームに移動し、次のブロックに進みます。

これは本当ですか?または、これらのプログラムは単に大量のデータをメモリに読み込んで圧縮し、書き込んでから、もう一度やり直しますか?または、これらの「ストリームコンプレッサー」で使用される巧妙なトリックはありますか?bzip2xzの両方のmanページでメモリ使用量について説明されていることがわかります。また、man bzip2は、圧縮するデータをブロックに分割してもほとんど失われないという事実を示唆しています。

ブロックサイズが大きくなると、限界リターンが急速に減少します。圧縮の大部分は、ブロックサイズの最初の200または300 kから発生します。これは、小型のマシンでbzip2を使用する場合に留意する価値のある事実です。解凍メモリの要件は、ブロックサイズの選択によって圧縮時に設定されることを理解することも重要です。

他のトリックが使用されているかどうか、またはこれについてもっと読むことができる場所については、まだ聞きたいです。

4

1 に答える 1

4

この質問は、圧縮アルゴリズムよりもバッファ処理に関連していますが、それについても少し言えます。

一部の圧縮アルゴリズムは本質的に「ブロックベース」です。つまり、特定のサイズのブロックを処理する必要があります。これはbzip2の状況であり、100kbから900kbへの「レベル」スイッチのおかげでブロックサイズが選択されます。したがって、データをストリーミングすると、ブロックがいっぱいになるのを待ち、いっぱいになるとこのブロックの圧縮を開始します(または、最後のブロックでは、受け取ったサイズに関係なく機能します)。

他のいくつかの圧縮アルゴリズムはストリームを処理できます。つまり、メモリバッファに保持されている古いデータを使用して、新しいデータを継続的に圧縮できます。「スライディングウィンドウ」に基づくアルゴリズムはそれを行うことができ、通常、zlibはそれを達成することができます。

現在、「スライディングウィンドウ」コンプレッサーでさえ、バッファー管理を容易にするため、またはpigzなどのマルチスレッド機能を開発するために、入力データをブロックにカットすることを選択できます。

于 2011-09-21T13:46:34.000 に答える