문제

는 사람이 있거나,알고,바이너리 패치 패 생성 알고리즘 구현 C#?

기본적으로,두 파일을 비교(정 고),패치 파일을 생성하는 데 사용할 수 있는 업그레이드 파일이 같은 내용으로 파일입니다.

구현해야 할 것이 상대적으로 빠르고 작업으로 거대한 파일이 있습니다.그것의 전시 한 O(n)또는 O(logn)런타임입니다.

내 자신의 알고리즘 경향이 있거나 형편(빠르지만 생산하는 거대한 패치)또는 느린(생산 작은 패치지만 O(n^2)런타임).

모든 통보 또는 포인터를 구현하는 것이 좋다.

특히,구현하는 데 사용될 서버에서는 동기화를 위한 다양한 대형 데이터 파일 우리가 우리 하나의 마스터 서버니다.때 마스터 서버는 데이터 파일의 변경,우리는 우리를 업데이트해야 할 여러 가지 오프 사이트뿐만 아니라 서버.

가장 순진한 알고리즘을 내가 만든 작동을 위한할 수 있는 파일을 메모리에,다음과 같습니다:

  1. 을 잡아 처음이전트로서 파일이 전화
  2. 추가 바이트는 사전 키>위치, 디 위치 위치입니다 어디를 잡고 그는 4 바이트를 0 으로 시작하는
  3. Skip 의 첫 번째 이 네 개의 바이트를 잡아 또 다른 4(3 겹치 1),하나 추가하여 같은 방법으로 사전
  4. 1-3 단계를 반복하십시오에 대한 모든 4 개의 바이트에서 블록 파일
  5. 에서의 시작 파일을 잡는 4 바이트를,그리고 시간에 그것을 사전
  6. 발견하는 경우,긴 일치 여러 가지가있는 경우,비교하여 바이트에서 두 개의 파일
  7. 인코딩에 대한 참조하는 위치에서 파일로 건너뛰기 일치하는 블록 파일
  8. 을 찾지 못한 경우,인코딩 1 바이트에서 파일,그리고 그것을 건너뛰
  9. 5-8 단계를 반복하여 나머지 파일

이와 같은 다소 압축하지 않고,윈도우,그래서 많이 사용하는 메모리.그것은,그러나 매우 빠르고,생산하는 아주 작은 패치로 내가 만들려고 코드 출력 최소화합니다.

더 메모리 효율적인 알고리즘을 사용하여 윈도우,그러나 생산하고 훨씬 더 큰 패치 파일이 있습니다.

더 많은 뉘앙스를 위한 알고리즘을 생략 이 게시물에,그러나 나는 게시할 수 있는 상세한 경우 필요합니다.그러나 저는 생각하는 것 다른 알고리즘을 모두 개선 그래서 위의 알고리즘은 아마도 나를 얻기 위하여 가고 있지 않은 것까지 충분합니다.


편집#1:여기에 대한 자세한 설명이 위의 알고리즘이 있습니다.

첫째,결합하는 두 파일을 가질 수 있도록,하나의 큰일이다.기 차단 지점 사이에 두 개의 파일이 있습니다.

둘째,그렇 을 잡는 4 바이트와 추가로 자신의 위치를 사전 단계에서 모든 것을 전체 파일입니다.

셋째,어디에서 파일 시작,하와 루프를 찾기 위해 시도하는 기존의 조합 4 바이트를,그리고 긴 일치합니다.는지 확인 우리만 고려의 위치에서 기존 파일에서,또는 이전에 새로운 파일보다 우리는 현재.이것은 다시 사용할 수 있습니다 우리는 물자 모두에서 오래되고 새로운 파일 중에 패치 응용 프로그램.


편집#2: 소스 코드를 위한 알고리즘

당신을 얻을 수 있습니다 경고에 대해 인증서를 갖는 몇 가지 문제가 있습니다.지 않을 해결하는 방법을 알고 있는 그래서 당분간 그냥 인증서를 적용합니다.

소스 사용의 많은 다른 종류의 나머지 부분에서 내 라이브러리도록 파일지 모든 걸리는지는 알고리즘을 구현합니다.


@lomaxx,나를 찾으려고 좋은 설명서에 대한 알고리즘에 사용되는 파괴라는 xdelta,하지만 당신은 이미 알고있는 방법 알고리즘,문서 나가 발견하지 못 말해 내가 무엇을 알아야 합니다.

또는 아마도 나는 그냥 고밀도...:)

나는 빠르팅 알고리즘에서는 해당 사이트를 했고,그것은 불행하게도 사용할 수 없습니다.코멘트에서 이진 차 파일을 말합니다:

을 찾는 최적의 설정의 차이 필요합 차 시간에 상대적 입력 크기,그래서 그것을 사용할 수 없게 됩니다.

나의 요구에 최적화되어 있지 않습니다만,그래서 내가 찾는 것이 더 실용적인 솔루션입니다.

답변 감사합니다 하지만,추가는 북마크를 그의 유틸리티의 경우 그들이 필요합니다.

편집#1:참고,에서 보이는 것입니다 그의 코드를 찾을 수 있는 몇 가지 아이디어를,그리고 내가 또 그를 보내는 이메일 나중에 질문,하지만 내가 읽은 그 책은 그 참조는 그리고 비록 이 솔루션은 좋은 최적의 솔루션을 찾기 위한,그것은 허무에서 사용으로 인해 시간 요구 사항입니다.

편집#2:나는 확실히 사냥 python xdelta 구현합니다.

도움이 되었습니까?

해결책

죄송하지 않았습이 포함되어 있습니다.나는 확실히 보고 xdelta 가 있기 때문에 그것을 사용하는 횟수를 생산하는 품질 차이에 600 메가바이트+ISO 일 우리가 생성 된 배포하는 우리의 제품 및 그것은 우수한 성능을 구현합니다.

다른 팁

bsdiff 을 만들 수 있도록 설계되었는 아주 작은 패치 바이너리 파일이 있습니다.로에 명시된 페이지가 필요합 max(17*n,9*n+m)+O(1) 의 바이트 메모리에서 실행됩 O((n+m) log n) 시간(여기서 n 은 크기의 파일 m 은 크기의 새로운 파일)입니다.

원래 구현에서는 C 지만,C#포트 설명 .

당신이 볼 VCDiff?그것의 일부입니다 기타 라이브러리에 나타나는 것은 매우 활성화(마지막 릴리스 r259,월 23 일,2008).나는 그것을 사용하지 않은,그러나 언급 할 가치가있다.

그것은 체크 아웃 가치가있을 수도 있습의 일부가 무엇인지 다른 사람이 하고 있는 이 공간에 반드시는 C#아레나다.

이 라이브러리입니다 c#으로 작성된

SVN 또는 이진 차 알고리즘이 구현에서는 파이썬지만 나는 그것을 찾을 수 없으로는 빠르게 검색 할 수 있습니다.그들은 당신을 줄 수 있는 몇 가지 아이디어에서 위치를 개선하는 방법 당신의 자신의 알고리즘

이 경우 설치 또는 유통,사용을 고려한 적이 있습 Windows Installer SDK?그것은 패치 할 수있는 기능을 바이너리 파일이 있습니다.

http://msdn.microsoft.com/en-us/library/aa370578(VS.85).aspx

이것은 거친 지침,하지만 다음은 재동기화 알고리즘을 만드는 데 사용할 수 있는 바이너리 패치입니다.

http://rsync.samba.org/tech_report/tech_report.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top