我已经压缩了存储在数据库中的数据。有没有办法将 50 个单独的 gzip 压缩数据连接成一个可以解压缩的 gzip 输出?结果应该与解压缩这 50 个项目、连接它们然后 gzip 压缩它们相同。
我想避免减压阶段。合并已经压缩的数据而不是压缩整个字节数组是否也有一些性能优势?
我已经压缩了存储在数据库中的数据。有没有办法将 50 个单独的 gzip 压缩数据连接成一个可以解压缩的 gzip 输出?结果应该与解压缩这 50 个项目、连接它们然后 gzip 压缩它们相同。
我想避免减压阶段。合并已经压缩的数据而不是压缩整个字节数组是否也有一些性能优势?
我假设仅以压缩格式连接任何文件将证明是灾难性的,因为压缩算法已在每个文件的特定内容上运行。我认为您必须手动解压缩所有文件,连接,然后再次压缩。
是的,您可以连接 gzip 流,当解压缩时,它会为您提供与连接未压缩数据并一次 gzip 压缩相同的效果。具体来说:
gzip a
gzip b
cat a.gz b.gz > c.gz
gunzip c.gz
会给你一样c
的:
cat a b > c
然而,与一次压缩整个东西相比,压缩会降低,特别是如果你的 50 块中的每一个都很小,例如小于几十个 K 字节。压缩后的结果总是不同的,根据片段的大小会稍微大一点或大很多。
应该注意另一个关于 GZIPStream 的答案中的评论。我还建议您改用DotNetZip。
GZip 是错误的,因此解压缩本身具有多个 gzip 成员的 gzip 文件也是错误的……即使在 .net 4.5 中,也不是所有 gzip 错误都已解决
进一步考虑每个 gzip 是在哪台机器上创建的,即它是 BGZF “Blocked GNU Zip Format”吗?这使手头的问题复杂化。
此外,生成的 gzip 文件可能比将所有未压缩的单个文件连接在一起时更大(gzip 不是一个很好的压缩算法集)。
如果还不算太晚,我建议您改用DotNetZip 。
GZipStream 并不是真正为处理多个文件而构建的,但是您可以使用 System.IO.BinaryWriter 和 System.IO.BinaryReader 来获得完全控制,尽管它可能会变得混乱。DotNetZip 可以正常工作!它旨在处理多个文件。
PS GZipStream 适用于 .Net 4 最大 8GB 的文件,尽管早期版本有一个下限,例如 GZipStream 适用于 .Net 3.5 最大 4GB 的文件