2009-07-17 2 views
11

두 개 이상의 gzip 스트림을 재 압축하지 않고 연결하려고합니다.두 개 이상의 gzip 파일/스트림을 연결하는 방법

나는 A를 A.gz로, B를 B.gz로 압축 했으므로 C 또는 C++을 사용하여 다시 압축하지 않고 단일 gzip (A + B) .gz로 압축하려고합니다.

몇 가지주의 사항 :

  • 비록 당신이 두 파일과 gunzip을 CONCAT 그들과 거래를하는 방법을 알게 될 것입니다 수 있습니다, 대부분의 프로그램은 두 덩어리를 처리 할 수 ​​없습니다.
  • 나는 한 번 파일을 압축 해제 한 다음 원본을 조작하고이 재빨리 정상적인 재 압축을 수행하는 코드 예를 보았지만 여전히 O (n) CPU 작업이 필요합니다.
  • 유감스럽게도 한 번 발견 한이 사례를 발견 할 수 없습니다 (감압 만 사용하는 연결). 누군가가 지적하면 좋을 것 같습니다.

참고 : 제안 된 솔루션이 내 요구에 맞지 않기 때문에 this과 중복되지 않습니다.

Clearification 편집 "인코딩 수락 : : gzip을"을, respnse "콘텐츠 인코딩 :

나는 몇 가지 압축 된 HTML의 PICES을 concate과 요청에 따라, 하나의 페이지로 브라우저로 보낼 GZIP을 "

스트림이 cat a.gz b.gz >ab.gz과 같이 간단하게 연결되면 Gecko (firefox) 및 KHTML 웹 엔진은 첫 번째 부분 (a) 만 가져옵니다. IE6는 아무것도 표시하지 않고 Google 크롬은 첫 번째 부분 (a)을 제대로 표시하고 두 번째 부분 (b)는 쓰레기로 표시합니다 (전혀 압축을 풀지 않음).

오페라에서만이 기능을 잘 처리합니다.

그래서 단일 청크의 gzip 스트림을 만들어 다시 압축하지 않고 보내야합니다.

업데이트 : zlib의 예에서 gzjoin.c을 찾았습니다. 압축 해제 만 사용합니다. 문제는 감압이 여전히 느리다는 것입니다. memcpy.

4 배 빠른 gzip 압축은 여전히 ​​빠릅니다. 그러나 그것은 충분하지 않습니다.

내가 필요한 것은 압축 해제 절차를 실행하지 않기 위해 gzip 파일과 함께 저장해야하는 데이터를 찾고 압축 중에이 데이터를 찾는 방법입니다. 를 보내고 것은 밖으로 질문하지 tar 경우

+0

정말로 압축할까요, 아니면 같은 파일에 연결하고 싶습니까? –

+0

두 개의 다른 gzip 압축 파일/스트림/메모리 청크 중 하나의 gzip 압축 파일/stream/memory-chunk를 압축 해제하지 않고 연결하고 다시 압축해야합니다. – Artyom

+0

수정 사항을 참조하십시오. – Artyom

답변

11

RFC1951RFC1952

형식은 단순히 구성원의 모음으로, 각 부분은 머리글, 데이터 및 예고편의 세 부분으로 구성됩니다.데이터 부분은 그 자체로 청크가 헤더와 데이터 부분을 갖는 청크의 집합입니다.

두 개 이상의 파일을 병합 한 결과를 gzipping하는 효과를 시뮬레이트하려면 머리글 (예 : 마지막 청크 플래그가 있음)과 예고편을 올바르게 조정하고 데이터 부분을 복사하기 만하면됩니다.

예고편에는 압축되지 않은 데이터의 CRC32가 있으며, 파트의 CRC를 알면 계산하기 쉽지 않은지 확실하지 않습니다.

편집 : 데이터를 압축 해제하지 않고 CRC32를 계산하는 것이 가능하지만 gzjoin.c 파일의 주석은 압축을 필요로하는 다른 것들이 있음을 암시합니다.

+1

조각에 대한 CRC가있는 경우이를 사용하여 최종 CRC를 계산할 수 있습니다. Crc1 및 Msg2가 Crc2 인 Msg1을 가지고 있고 [Msg1, Msg2]의 crc를 계산하려면 [Crc1, 0,0,0,0 ... (제로 Msg2 길이 시간)] 및 xor 또는 Crc2. 희망은 어딘가에있을 것이지만 그 아이디어는 이것입니다. – eugensk00

2

합니다 (cat solution를 연결하기 때문에 당신을 위해 가능한 아닙니다) :

tar cf A_B.gz.tar A.gz B.gz 

그런 다음, 그들을 다시 얻을 수 있습니다 :에서

tar xf A_B.gz.tar 
+0

아니, 나는 타르에 대해 전혀 말하지 않고있다. – Artyom

+1

나는 지금 당신이 말하는 것을보고있다. . . O (1) 처리 시간을 달성하기 위해 "gunzip A.gz & guzip B.gz & cat A B> C & gzip C.gz A B"와 동등한 작업을 원합니다. gzip은 그렇게하지 않을 것이며, 할 수있는 유틸리티가 있는지 모르겠습니다. 그러나 압축 파일을 압축하는 방법을 알아 내기 위해 압축 파일을 검사해야하므로 O (n) 시간이 필요합니다. –

+0

타르를 잘못 쓰면 원하는 모든 것을 얻을 수 있습니다. –

2

개별 파일의 원래 압축은 사용자가 수행 한 것으로 보입니다. 원하는 결과 (여러 부분의 연결)가 한 페이지의 웹 브라우저로 전송 될만큼 충분히 작아 보인다. 그런 경우 귀하의 효율성에 대한 우려가 부당하다고 여겨집니다.

(1) gzjoin.c 접근법은 gzip 작성자 중 한 명이 수행 한 복잡한 미세 수술이며 (2) 설명 된대로 질문에 대한 최상의 답변 일 가능성이 높습니다. 광범위한 스트레스 테스트의 대상이되었습니다.

오리지널 조각을 압축되지 않은 상태로 저장 한 다음 필요한 조각을 선택하고 연결하고 압축하여 지루하고 이해할 수있는 신뢰할 수있는 방법을 고려하십시오. 압축 비율은 작은 압축 된 부분을 함께 붙인 것에 비해 얻을 수 있습니다.

+0

예, 저는 두 개의 청크의 창시자입니다. 따라서 메타 데이터를 저장하거나 일부 가정을 할 수도 있습니다. 그래서 나는 gzjoin이 가장 간단하고 에러가 발생하기 쉽지 않다는 것을 이해한다. 그러나 여전히 단순한 "gzip -1"보다 4 배 빠르다. 나는 스피드 업 근처에서 memcpy가 필요해. 아이디어 : 일부 준비된 청크를 캐시하고 사용자 요청별로 결합합니다. – Artyom

+0

데이터 량이 적은 것 같은 이유로 "memcpy near speedup"이 필요한 이유를 설명하지 않았습니다. 아마도 당신은 얼마나 많은 페이지를 초당 봉사해야하는지 그리고 얼마나 큰지 말할 수 있습니다. –

+0

페이지와 청크가 크고 하중이 극도로 높다고 가정 해 봅시다. – Artyom

6

gzip 설명서에 시도한대로 두 개의 gzip 파일을 연결할 수 있다고 나와 있습니다.

http://www.gnu.org/software/gzip/manual/gzip.html#Advanced-usage

그래서 다른 도구가 파손 될 수 있음을 나타납니다. 이 버그 보고서에서 볼 수 있습니다. http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=97263

각 브라우저 제조사에 버그 보고서를 제출하는 것 외에도 브라우저 제조업체가 요구하는 데이터의 가장 일반적인 연결을 캐싱 할 수있는 프로그램이 있습니다. http://www.gzip.org/zlib/rfc-gzip.html

그리고 이것은 최종 압축 파일의 CRC-32가 필요합니다 다른 사람들이 당신이 수술을 수행 할 수 있습니다 언급 한 바와 같이

. 압축되지 않은 파일의 필요한 크기는 개별 하위 파일의 길이를 추가하여 쉽게 계산할 수 있습니다.

마지막 링크 맨 아래에 실행중인 crc-32라는 update_crc를 계산하는 코드가 있습니다.

프로세스가 실행될 때마다 압축되지 않은 파일에서 crc를 계산하면 gzip 알고리즘 자체보다 비용이 적게 듭니다.

+0

. NET 라이브러리에 관해서는 개인적으로이 라이브러리가 다중 파트 GZip 파일을 지원하는지 확인했습니다. http://www.icsharpcode.net/opensource/sharpziplib/ – DenNukem

관련 문제