以前のファイルに関係なく、各ファイルのブロックは圧縮されますかrsync -z
、それとも独立して処理されるように各ファイルに対して圧縮辞書がリセットされますか?
たとえば、圧縮可能ファイルone.txt
とそのファイルの同じコピーが両方のファイルに存在しないリモートサーバーに転送されるとします。
cp -p one.txt two.txt
rsync -az one.txt two.txt remote:
圧縮階層は合計を独立してzlib
処理しますか、それともそのレベルのデータ転送が連続ストリームなので、適用できる有用な圧縮辞書を学習しますか?one.txt
two.txt
one.txt
two.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
ファイル全体にハッシュを拡張する方が面白いかもしれません。
提案されているように、圧縮可能なファイルの複数のコピーを同期して、これらすべてを実験的に確認できます。統計は、常に送信されたサイズが個々のファイルの圧縮サイズにコピー数を掛けたものと同じであることを示しています。ファイル全体で重複したデータ型が削除されます。