各ファイルに対してrsyncブロック圧縮辞書をリセットする必要がありますか?

各ファイルに対してrsyncブロック圧縮辞書をリセットする必要がありますか?

以前のファイルに関係なく、各ファイルのブロックは圧縮されますかrsync -z、それとも独立して処理されるように各ファイルに対して圧縮辞書がリセットされますか?

たとえば、圧縮可能ファイルone.txtとそのファイルの同じコピーが両方のファイルに存在しないリモートサーバーに転送されるとします。

cp -p one.txt two.txt
rsync -az one.txt two.txt remote:

圧縮階層は合計を独立してzlib処理しますか、それともそのレベルのデータ転送が連続ストリームなので、適用できる有用な圧縮辞書を学習しますか?one.txttwo.txtone.txttwo.txt

zlibそれとも(たとえば)常に新しいブロックごとに辞書をリセットするなど、圧縮アルゴリズムを完全に誤解していますか?

rsyncデバッグ出力を見てみましたが、rsync -avvvvz --debug=IO1,IO2,IO3,IO4 --msgs2stderr圧縮レイヤーに特に関連するものは表示されません。

(これはフォローアップです。コメントエリアServerFaultに対する私の答えに基づいています。 )

答え1

rsync圧縮の使用token.c、そこにしかないようです。変数は収縮フロー状態を維持し、前のフラグがtx_strm-1のときにフロー状態をリセットします。send_deflated_token

        if (last_token == -1) {
                /* initialization */
                if (!init_done) {
                        tx_strm.next_in = NULL;
                        tx_strm.zalloc = NULL;
                        tx_strm.zfree = NULL;
                        if (deflateInit2(&tx_strm, compression_level,
                                         Z_DEFLATED, -15, 8,
                                         Z_DEFAULT_STRATEGY) != Z_OK) {
                                rprintf(FERROR, "compression init failed\n");
                                exit_cleanup(RERR_PROTOCOL);
                        }
                        if ((obuf = new_array(char, OBUF_SIZE)) == NULL)
                                out_of_memory("send_deflated_token");
                        init_done = 1;
                } else
                        deflateReset(&tx_strm);

これは後で使用されますmatch.c渡すこのmatch機能hash_searchはおよびで使用されますmatch_sums。これらの関数は常に-1に設定された呼び出しで処理を完了し、last_token次の呼び出しで収縮ストリームをリセットします。これらの操作はすべてファイルごとに実行されるため、収縮ストリームは常に各ファイルの先頭でリセットされます。

これは、ブロック圧縮辞書が各ファイルに対してリセットされることを保証し、より頻繁にリセットされることを意味します。

古いファイルのデータを使用したい場合は、rsyncファイル全体にハッシュを拡張する方が面白いかもしれません。

提案されているように、圧縮可能なファイルの複数のコピーを同期して、これらすべてを実験的に確認できます。統計は、常に送信されたサイズが個々のファイルの圧縮サイズにコピー数を掛けたものと同じであることを示しています。ファイル全体で重複したデータ型が削除されます。

関連情報