2013-03-27 4 views
1

DB에 저장된 데이터를 gzipped했습니다. 50 개의 개별 gzip 데이터를 압축 해제 할 수있는 하나의 gzip 출력으로 연결하는 방법이 있습니까? 결과는 50 개 항목의 압축을 풀고 연결 한 다음 gzipping하는 것과 동일해야합니다.C#에서 gzipped 바이트 배열 연결

나는 압축 해제 단계를 피하고 싶습니다. 전체 바이트 배열을 gzip하는 대신 gzipped 데이터를 병합하는 것이 성능상의 이점이 있습니까?

+2

gzipped 데이터를 연결해도 연결된 데이터를 gzipping하는 것과 같은 결과를 얻지 못합니다. – dtb

+0

그러나 그 두 gunzipping _does_ 동일한 결과를 제공합니다. –

답변

1

네, gzip 스트림을 연결할 수 있습니다. 압축 해제시 압축되지 않은 데이터를 연결 한 다음 gzip을 한꺼번에 gzip으로 압축 한 것과 같은 결과를 얻을 수 있습니다. 특히 :

gzip a 
gzip b 
cat a.gz b.gz > c.gz 
gunzip c.gz 

같은 c로 당신에게 줄 것이다 :

cat a b > c 
압축하여 50 개 각, 예를 들어, 작은 특히, 한 번에 모든 일을 Gzip으로 압축에 비해 떨어집니다 그러나

K 바이트의 몇 가지 10 미만. 압축 된 결과는 항상 달라지며 조각의 크기에 따라 조금씩 더 커집니다.

GZIPStream에 대한 다른 답변의 댓글에주의해야합니다. 대신 DotNetZip을 사용하는 것이 좋습니다.

+0

이 연결은 처음부터 모든 것을 gziping하는 것보다 빠릅니까? 이 파일들은 압축 된 약 5-10k이지만 xml이므로 모든 파일에서 태그를 공유해야합니다. 나는 그 때문에 압축의 저하가 그렇게해서는 안된다고 믿습니다. – Marka

+0

예, 병합은 압축하는 것보다 훨씬 빠릅니다. 그러나 5-10K 조각은 아주 작고 크기가 작기 때문에 모든 내용을 단일 스트림으로 다시 압축하면 압축이 크게 향상 될 것으로 예상됩니다. –

2

zip 형식의 파일을 연결하는 것만으로 파일 당 특정 내용에 대해 압축 알고리즘이 실행되기 때문에 비참한 것으로 판단됩니다. 수동으로 압축을 풀고 연결 한 다음 다시 압축해야한다고 생각합니다.

+0

잘못되었습니다. 다시 압축 할 필요가 없으며 질문은 zip 형식이 아니라 gzip 형식에 관한 것입니다. 단점은 압축을 모두 재 압축하는 것과 비교할 때 압축 저하입니다. –

+0

@MarkAdler 내가 믿기 때문에 모든 유형의 지퍼 링 - 지퍼링 알고리즘을 적용하기 때문에 일반적으로 지퍼 링에 대해 이야기하고있었습니다. 질문의 첫 번째 단락을 읽으면 다음과 같이 나타납니다. "...그 결과는 50 개 항목의 압축을 풀고 그것들을 연결 한 다음 gzip하는 것과 동일해야합니다. " –

+0

gzip 형식이 연결을 명시 적으로 허용하기 때문에 일반적으로 연결에 대한 질문을 일반적으로"압축 "하는 것에 대해 말하기는 어렵습니다. 반면 zip 형식은 연결을 허용합니다 gzip 스트림을 연결하는 데 "비참한"것은 없습니다. 오해의 소지가 없도록 해답을 다시 작성해야합니다. 연결하여 정확히 동일한 압축 된 스트림을 가져올 수 없다고 말하고 싶다면, 그렇게해야합니다. 그러나 동일한 _decompressed_ 데이터를 가져옵니다. –

0

Gzip으로 버그는 또한 각 GZIP이 생성 된 것을 기계 고려도 .NET 4.5

에서 다림질 된 GZip으로 압축 모두가 ...있는 moreso 자체가 여러 GZIP의 회원을 보유 gzip으로 파일을 압축 해제, 버그 버그가 없습니다 on, 즉 BGZF "Blocked GNU Zip Format"입니까? 당면 문제를 복잡하게 만든다.

결과 gzip 파일은 압축되지 않은 개별 파일을 모두 연결 한 경우 (gzip은 매우 좋은 압축 알고리즘 집합이 아님)보다 클 수 있습니다.

너무 늦지 않은 경우 DotNetZip을 대신 사용하는 것이 좋습니다.

GZipStream은 실제로 여러 파일을 처리 할 수있는 기능이 없지만 System.IO.BinaryWriter 및 System.IO.BinaryReader를 사용하면 완전히 제어 할 수 있습니다. DotNetZip이 작동합니다! 그것은 여러 파일을 처리하도록 설계되었습니다.

P. GZipStream은 .Net 4를 사용하여 최대 8GB의 파일 크기에서 작동하지만 이전 버전에는 한도가 있습니다 (예 : GZipStream은 .Net 3.5에서 최대 4GB의 파일 크기를 지원합니다.

+0

DotNetZip을 사용하여 [Google Freebase gz 파일] (https : //developers.g)에서 데이터를 스트리밍 할 수 있습니까 (연결 파일 200 개, 이해합니다). oogle.com/freebase/data)? 파일 크기는 약 25GB입니다. 또는 파일을 처리하기 전에 파일을 원래 250GB 형식으로 압축 해제해야 할 필요가 있습니까? 이것은 [다른 스레드에 대한 내 질문] (http://stackoverflow.com/questions/21868658/c-sharp-parsing-of-freebase-rdf-dump-yields-only-11-5-million-n-triples)과 관련이 있습니다. - 대신). –