2016-11-23 6 views
2

rsync와 호환 될 수있는 데이터를 압축 할 수있는, 즉 gzip --rsyncable과 같은 방식으로 작동하는 모든 Windows (가능하면 .NET) 라이브러리를 추천 해 주시겠습니까? zlib에 대한 몇 가지 요청 변경 사항을 발견했지만 구현되지 않은 것으로 보입니다. 블록을 독립적으로 압축한다고 생각하는 병렬 압축 알고리즘을 사용하려고했지만 운이 없었습니다. 원본 파일을 변경하면 압축 된 파일이 완전히 변경됩니다.Rsyncable 압축 라이브러리

-> I은 ZLIB 동기화 모드를 노출 4096 일정한 버퍼와 동기화 세척 모드로 사용하지만, 입력 파일 다시 심지어 작은 변경이 될 수있는 출력 파일을 만드는 DotNetZip 라이브러리를 잡고

EDIT completety 다른. 내가 잘못 할 수있는 것은 무엇인가?

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 비트를 사용할 수 있습니다. 의견을보십시오.