Rsyncable压缩库

Rsyncable compression library

您能否向我推荐任何 Windows(最好是 .NET)库,它允许压缩与 rsync 兼容的数据,即以 gzip --rsyncable 的方式运行。我发现了 zlib 的一些请求更改,但似乎还没有实现。 我尝试使用一些并行压缩算法,认为它会独立地对块进行压缩,但没有运气(原始文件中的任何更改都会使压缩后的文件完全更改)。

--> 编辑

我抓取了一个公开 ZLib 同步模式的 DotNetZip 库,并将其与 4096 的常量缓冲区和同步刷新模式一起使用,但同样,即使输入文件中的微小变化也会使输出文件完全不同。我可能做错了什么?

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.
        }
    }
}

您可以为此使用 zlib,它已经提供了您所需要的一切。这只是插入 Z_SYNC_FLUSH 刷新的问题,足够频繁,但不要太频繁,由未压缩数据中的模式触发。

您可以查看 pigz's implementation 中的示例,使用输入数据的非常简单的散列来查找 12 位模式。您可以改用 13 位,以减少压缩影响。看评论。