串联在C#gzip压缩字节数组(Concatenate gzipped byte arrays in

2019-10-17 21:56发布

我已经gzip压缩存储在DB数据。 有没有一种方法来连接说50个分开gzip压缩的数据转换成一个gzip压缩输出,还可以解压缩? 结果应该是一样的和解压缩50项,串联它们,然后使用gzip压缩它们。

我想,以避免减压阶段。 是否有合并也已经gzip压缩的数据,而不是使用gzip压缩整个字节数组的一些性能优势?

Answer 1:

是的,你可以连接gzip的数据流,它解压缩时给你同样的事情,如果你已经连接在一起的未压缩数据和gzip压缩,一次就全部。 特别:

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

会给你同样的c为:

cat a b > c

然而,压缩将被降级相比,在一次使用gzip压缩了整个事情,尤其是如果您的每50件很小,例如小于几个10年代千字节。 压缩的结果将永远是不同的,和一点点还是很多更大的取决于块的大小。

在约GZIPStream另一个答案的评论应该得到重视。 我也建议你使用DotNetZip代替。



Answer 2:

我会认为,作为荏苒算法已经对每个文件的具体内容运行仅仅停留在一个压缩格式串联的任何文件将被证明是灾难性的。 我认为你将不得不手动解压所有,拼接,然后再压缩。



Answer 3:

Gzip已越野车,moreso解压缩其本身具有多个gzip的成员gzip文件是越野车......不是所有的gzip错误的甚至在.NET 4.5中冰释前嫌

此外考虑每个gzip的创建是什么机器,即它是一个BGZF“阻止GNU Zip格式”? 其复杂手头的问题。

此外,产生的gzip文件能比,如果你把所有的未压缩的单个文件连接在一起(gzip的是不是一个很好的压缩算法集)大。

我建议你使用DotNetZip代替,如果它不是为时已晚。

GZipStream是不是真的用来处理多个文件,但是你可以使用System.IO.BinaryWriter和System.IO.BinaryReader获得完全控制,但它会导致混乱。 DotNetZip只是工作! 它被设计成处理多个文件。

PS GZipStream适用于文件大小可达8GB在.NET 4中,虽然早期版本有一个下限,如GZipStream适用于文件大小高达4GB与.net 3.5



文章来源: Concatenate gzipped byte arrays in C#