2009-09-30 5 views
9

bzip2 파일 (5GB 이상)이 있고 블록 #x 만 압축을 풀고 싶다고 말합니다. 내 데이터가있는 곳 (블록이 매번 다릅니다)이 있기 때문입니다. 어떻게하면 좋을까요?특정 bzip2 블록의 압축을 풉니 다.

모든 블록이 어디에 있는지 색인을 작성한 다음 파일에서 필요로하는 블록을 잘라내 bzip2recover를 적용하는 방법에 대해 생각했습니다.

또한 한 번에 1MB라고 말한 다음 파일에이 파일을 추가하고 위치를 기록하는 방법을 생각해 보았습니다. 필요할 때 파일을 간단히 가져 오는 것이었지만 원본 bzip2 파일은 그대로 유지하고 싶습니다.

내가 선호하는 언어는 Ruby이지만 모든 언어의 해결책은 저에게 있습니다 (원칙을 이해하는 한).

답변

6

http://bitbucket.org/james_taylor/seek-bzip2

잡아 소스가있다, 컴파일.

./seek-bzip2 32 < bzip_compressed.bz2 

실행을 테스트합니다.

유일한 매개 변수는 이상한 블록 헤더의 비트 변위입니다. 바이너리 파일에 "31 41 59 26 53 59"16 진수 문자열을 찾는 것으로 얻을 수 있습니다. 이것은 잘못되었습니다. 블록 시작은 바이트 경계에 정렬되지 않을 수 있으므로 "31 41 59 26 53 59"16 진수 문자열을 bzip2recover에서 수행 할 때마다 검색해야합니다. http://www.bzip.org/1.0.3/html/recovering.html

32는 "BZh1 "헤더 1은"1 "에서"9 "까지의 임의의 숫자가 될 수 있습니다 (클래식 bzip2에서) - 이것은 수백 킬로 비트 (정확히는 아님)의 (압축되지 않은) 블록 크기입니다.

+0

sic! 블록 시작은 바이트 경계가 아닐 수 있습니다 :(원래의 데이터 블록 크기의 비트 변위와 크기의 목록을 얻으려면 "seek-bzip2"에 bzip 테이블 프로그램이 있습니다.) – osgx

+0

불행하게도 "bzip 테이블"은 거의 동일합니다 실제 압축 풀기 속도 : (. 그것은 거의 전체 압축 풀기 사이클을 수행하지만 CRC를 확인하지 않습니다. – osgx

+0

또한 Jeff Gilchrist의 pbzip2와 같은 병렬 bzips를 살펴보십시오. 병렬 압축 풀기에서 블록 헤더를 검색해야합니다 코드 : http://www.google.com/codesearch/p?hl=ko#calSvFpbfuI/trunk/trunk/demo/pbzip2-1.0.2/pbzip2.cpp&q=pbzip2&sa=N&cd=2&ct=rc&l=3'producer_decompress' 함수 – osgx

2

bzip-table은 압축 풀기와 거의 비슷하지만 실제로는 한 번만 수행하면되고 출력을 저장하여 인덱스로 사용할 수 있습니다. 이것은 내가 필요로하는 것에 완벽하지만 모든 사람이 필요로하지 않을 수도 있습니다.

Windows에서 컴파일하는 데 약간의 도움이 필요했습니다.

+0

msys와 함께 mingw 시도 – osgx

+0

http://sourceforge.net/projects/mingw/files/Automated%20MinGW%20Installer/mingw-get-inst/mingw-get-inst-20110316/mingw-get-inst-20110316.exe/download – osgx

관련 문제