DB에 저장된 데이터를 gzipped했습니다. 50 개의 개별 gzip 데이터를 압축 해제 할 수있는 하나의 gzip 출력으로 연결하는 방법이 있습니까? 결과는 50 개 항목의 압축을 풀고 연결 한 다음 gzipping하는 것과 동일해야합니다.C#에서 gzipped 바이트 배열 연결
나는 압축 해제 단계를 피하고 싶습니다. 전체 바이트 배열을 gzip하는 대신 gzipped 데이터를 병합하는 것이 성능상의 이점이 있습니까?
DB에 저장된 데이터를 gzipped했습니다. 50 개의 개별 gzip 데이터를 압축 해제 할 수있는 하나의 gzip 출력으로 연결하는 방법이 있습니까? 결과는 50 개 항목의 압축을 풀고 연결 한 다음 gzipping하는 것과 동일해야합니다.C#에서 gzipped 바이트 배열 연결
나는 압축 해제 단계를 피하고 싶습니다. 전체 바이트 배열을 gzip하는 대신 gzipped 데이터를 병합하는 것이 성능상의 이점이 있습니까?
네, 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을 사용하는 것이 좋습니다.
이 연결은 처음부터 모든 것을 gziping하는 것보다 빠릅니까? 이 파일들은 압축 된 약 5-10k이지만 xml이므로 모든 파일에서 태그를 공유해야합니다. 나는 그 때문에 압축의 저하가 그렇게해서는 안된다고 믿습니다. – Marka
예, 병합은 압축하는 것보다 훨씬 빠릅니다. 그러나 5-10K 조각은 아주 작고 크기가 작기 때문에 모든 내용을 단일 스트림으로 다시 압축하면 압축이 크게 향상 될 것으로 예상됩니다. –
zip 형식의 파일을 연결하는 것만으로 파일 당 특정 내용에 대해 압축 알고리즘이 실행되기 때문에 비참한 것으로 판단됩니다. 수동으로 압축을 풀고 연결 한 다음 다시 압축해야한다고 생각합니다.
잘못되었습니다. 다시 압축 할 필요가 없으며 질문은 zip 형식이 아니라 gzip 형식에 관한 것입니다. 단점은 압축을 모두 재 압축하는 것과 비교할 때 압축 저하입니다. –
@MarkAdler 내가 믿기 때문에 모든 유형의 지퍼 링 - 지퍼링 알고리즘을 적용하기 때문에 일반적으로 지퍼 링에 대해 이야기하고있었습니다. 질문의 첫 번째 단락을 읽으면 다음과 같이 나타납니다. "...그 결과는 50 개 항목의 압축을 풀고 그것들을 연결 한 다음 gzip하는 것과 동일해야합니다. " –
gzip 형식이 연결을 명시 적으로 허용하기 때문에 일반적으로 연결에 대한 질문을 일반적으로"압축 "하는 것에 대해 말하기는 어렵습니다. 반면 zip 형식은 연결을 허용합니다 gzip 스트림을 연결하는 데 "비참한"것은 없습니다. 오해의 소지가 없도록 해답을 다시 작성해야합니다. 연결하여 정확히 동일한 압축 된 스트림을 가져올 수 없다고 말하고 싶다면, 그렇게해야합니다. 그러나 동일한 _decompressed_ 데이터를 가져옵니다. –
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의 파일 크기를 지원합니다.
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)과 관련이 있습니다. - 대신). –
gzipped 데이터를 연결해도 연결된 데이터를 gzipping하는 것과 같은 결과를 얻지 못합니다. – dtb
그러나 그 두 gunzipping _does_ 동일한 결과를 제공합니다. –