문제
는 사람이 있거나,알고,바이너리 패치 패 생성 알고리즘 구현 C#?
기본적으로,두 파일을 비교(정 오 고 뉴고),패치 파일을 생성하는 데 사용할 수 있는 업그레이드 오 파일이 같은 내용으로 뉴 파일입니다.
구현해야 할 것이 상대적으로 빠르고 작업으로 거대한 파일이 있습니다.그것의 전시 한 O(n)또는 O(logn)런타임입니다.
내 자신의 알고리즘 경향이 있거나 형편(빠르지만 생산하는 거대한 패치)또는 느린(생산 작은 패치지만 O(n^2)런타임).
모든 통보 또는 포인터를 구현하는 것이 좋다.
특히,구현하는 데 사용될 서버에서는 동기화를 위한 다양한 대형 데이터 파일 우리가 우리 하나의 마스터 서버니다.때 마스터 서버는 데이터 파일의 변경,우리는 우리를 업데이트해야 할 여러 가지 오프 사이트뿐만 아니라 서버.
가장 순진한 알고리즘을 내가 만든 작동을 위한할 수 있는 파일을 메모리에,다음과 같습니다:
- 을 잡아 처음이전트로서 오 파일이 전화 키
- 추가 바이트는 사전 키>위치, 디 위치 위치입니다 어디를 잡고 그는 4 바이트를 0 으로 시작하는
- Skip 의 첫 번째 이 네 개의 바이트를 잡아 또 다른 4(3 겹치 1),하나 추가하여 같은 방법으로 사전
- 1-3 단계를 반복하십시오에 대한 모든 4 개의 바이트에서 블록 오 파일
- 에서의 시작 뉴 파일을 잡는 4 바이트를,그리고 시간에 그것을 사전
- 발견하는 경우,긴 일치 여러 가지가있는 경우,비교하여 바이트에서 두 개의 파일
- 인코딩에 대한 참조하는 위치에서 오 파일로 건너뛰기 일치하는 블록 뉴 파일
- 을 찾지 못한 경우,인코딩 1 바이트에서 뉴 파일,그리고 그것을 건너뛰
- 5-8 단계를 반복하여 나머지 뉴 파일
이와 같은 다소 압축하지 않고,윈도우,그래서 많이 사용하는 메모리.그것은,그러나 매우 빠르고,생산하는 아주 작은 패치로 내가 만들려고 코드 출력 최소화합니다.
더 메모리 효율적인 알고리즘을 사용하여 윈도우,그러나 생산하고 훨씬 더 큰 패치 파일이 있습니다.
더 많은 뉘앙스를 위한 알고리즘을 생략 이 게시물에,그러나 나는 게시할 수 있는 상세한 경우 필요합니다.그러나 저는 생각하는 것 다른 알고리즘을 모두 개선 그래서 위의 알고리즘은 아마도 나를 얻기 위하여 가고 있지 않은 것까지 충분합니다.
편집#1:여기에 대한 자세한 설명이 위의 알고리즘이 있습니다.
첫째,결합하는 두 파일을 가질 수 있도록,하나의 큰일이다.기 차단 지점 사이에 두 개의 파일이 있습니다.
둘째,그렇 을 잡는 4 바이트와 추가로 자신의 위치를 사전 단계에서 모든 것을 전체 파일입니다.
셋째,어디에서 뉴 파일 시작,하와 루프를 찾기 위해 시도하는 기존의 조합 4 바이트를,그리고 긴 일치합니다.는지 확인 우리만 고려의 위치에서 기존 파일에서,또는 이전에 새로운 파일보다 우리는 현재.이것은 다시 사용할 수 있습니다 우리는 물자 모두에서 오래되고 새로운 파일 중에 패치 응용 프로그램.
편집#2: 소스 코드를 위한 알고리즘
당신을 얻을 수 있습니다 경고에 대해 인증서를 갖는 몇 가지 문제가 있습니다.지 않을 해결하는 방법을 알고 있는 그래서 당분간 그냥 인증서를 적용합니다.
소스 사용의 많은 다른 종류의 나머지 부분에서 내 라이브러리도록 파일지 모든 걸리는지는 알고리즘을 구현합니다.
@lomaxx,나를 찾으려고 좋은 설명서에 대한 알고리즘에 사용되는 파괴라는 xdelta,하지만 당신은 이미 알고있는 방법 알고리즘,문서 나가 발견하지 못 말해 내가 무엇을 알아야 합니다.
또는 아마도 나는 그냥 고밀도...:)
나는 빠르팅 알고리즘에서는 해당 사이트를 했고,그것은 불행하게도 사용할 수 없습니다.코멘트에서 이진 차 파일을 말합니다:
을 찾는 최적의 설정의 차이 필요합 차 시간에 상대적 입력 크기,그래서 그것을 사용할 수 없게 됩니다.
나의 요구에 최적화되어 있지 않습니다만,그래서 내가 찾는 것이 더 실용적인 솔루션입니다.
답변 감사합니다 하지만,추가는 북마크를 그의 유틸리티의 경우 그들이 필요합니다.
편집#1:참고,에서 보이는 것입니다 그의 코드를 찾을 수 있는 몇 가지 아이디어를,그리고 내가 또 그를 보내는 이메일 나중에 질문,하지만 내가 읽은 그 책은 그 참조는 그리고 비록 이 솔루션은 좋은 최적의 솔루션을 찾기 위한,그것은 허무에서 사용으로 인해 시간 요구 사항입니다.
편집#2:나는 확실히 사냥 python xdelta 구현합니다.
해결책
죄송하지 않았습이 포함되어 있습니다.나는 확실히 보고 xdelta 가 있기 때문에 그것을 사용하는 횟수를 생산하는 품질 차이에 600 메가바이트+ISO 일 우리가 생성 된 배포하는 우리의 제품 및 그것은 우수한 성능을 구현합니다.
다른 팁
당신이 볼 VCDiff?그것의 일부입니다 기타 라이브러리에 나타나는 것은 매우 활성화(마지막 릴리스 r259,월 23 일,2008).나는 그것을 사용하지 않은,그러나 언급 할 가치가있다.
그것은 체크 아웃 가치가있을 수도 있습의 일부가 무엇인지 다른 사람이 하고 있는 이 공간에 반드시는 C#아레나다.
SVN 또는 이진 차 알고리즘이 구현에서는 파이썬지만 나는 그것을 찾을 수 없으로는 빠르게 검색 할 수 있습니다.그들은 당신을 줄 수 있는 몇 가지 아이디어에서 위치를 개선하는 방법 당신의 자신의 알고리즘
이 경우 설치 또는 유통,사용을 고려한 적이 있습 Windows Installer SDK?그것은 패치 할 수있는 기능을 바이너리 파일이 있습니다.
http://msdn.microsoft.com/en-us/library/aa370578(VS.85).aspx
이것은 거친 지침,하지만 다음은 재동기화 알고리즘을 만드는 데 사용할 수 있는 바이너리 패치입니다.