2016-11-23 15 views
2

rsyncと互換性がある、つまりgzip --rsyncableのように動作するデータを圧縮できるWindows(できれば.NET)ライブラリをお勧めしますか? zlibのリクエストの変更がいくつか見つかりましたが、実装されていないようです。 私はいくつかの並列圧縮アルゴリズムを使用しようとしましたが、それはブロック上で独立して圧縮を行うと思っていましたが、幸運にも(元のファイルの変更によって圧縮されたものが完全に変更される)Rsyncable圧縮ライブラリ

- > EDIT

私はzlibの同期モードを公開し、4096の定数バッファと同期フラッシュモードで使用DotNetZipライブラリをつかんだが、再度、入力ファイル内にも小さな変化があることを、出力ファイルを作ります完全に異なる。私が間違って行うことができるのは何ですか?

using (var inputStream = new FileStream("file.in", FileMode.Open)) 
using (var outputStream = new FileStream("file.out", FileMode.Create)) 
{ 
    using (var compressor = new DeflateStream(outputStream, Ionic.Zlib.CompressionMode.Compress)) 
    { 
     byte[] buffer = new byte[4096]; 
     int n; 
     while ((n = inputStream.Read(buffer, 0, buffer.Length)) > 0) 
     { 
      compressor.FlushMode = FlushType.Sync; 
      compressor.Write(buffer, 0, n); 
      compressor.Flush(); 
      // actually, Flush() is not needed, DeflateStream automatically flushes on every write. 
     } 
    } 
} 
+1

シンクを行うと単純に周期的になることはありません。それは入力データに依存しなければならない。私が提供したソースコードへのリンクを読む必要があります。 –

+0

@gregi .NETでrsyncable defalte圧縮を達成できましたか?コードを共有できますか? – Stritof

答えて

3

あなたはすでにあなたが必要なすべてを提供し、このためzlibを、使用することができます。 Z_SYNC_FLUSHフラッシュを頻繁に挿入するだけですが、非圧縮データのパターンによってトリガーされることはあまりありません。

pigz's implementationの例を見ると、入力データの非常に単純なハッシュを使用して、12ビットパターンを探します。代わりに13ビットを使用して、圧縮の影響を少なくすることができます。コメントを参照してください。