首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >部分gz解压可行吗?

部分gz解压可行吗?
EN

Stack Overflow用户
提问于 2014-05-15 18:50:16
回答 3查看 9.3K关注 0票数 13

为了处理存储为.gz文件的图像(我的图像处理软件可以读取.gz文件以获得更短/更小的磁盘时间/空间),我需要检查每个文件头。

头部只是每个图像开头的一个固定大小的小结构,对于没有压缩的图像,检查它是非常快的。为了读取压缩的图像,我别无选择,只能解压缩整个文件,然后检查这个头文件,这当然会减慢我的程序。

是否可以读取.gz文件的第一个片段(比方说几个K),解压缩此片段并读取原始内容?我对gz的理解是,在一开始进行一些记账后,压缩数据将按顺序存储--这是正确的吗?

因此,不是

打开大文件F

  • decompress大文件F

  • read 500字节header

  • re-compress大文件F

作为来自B的stream A

  • decompress

  • as stream F

  • read 500字节头,
  1. 打开来自F的前5 K的大文件

我使用的是libz.so,但其他语言的解决方案很受欢迎!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-06 18:05:25

例如,您可以使用gzip -cd file.gz | dd ibs=1024 count=10仅解压缩前10个KiB。

gzip -cd解压为标准输出。

通过管道将其|dd实用程序中。

dd实用程序将标准输入复制到标准输出。因此,dd ibs=1024将输入块大小设置为1024字节,而不是默认的512字节。

count=10只复制了10个输入块,因此停止了gzip解压缩。

您将使用标准的512块大小执行gzip -cd file.gz | dd count=1,并忽略额外的12个字节。

注释突出显示您可以使用gzip -cd file.gz | head -c $((1024*10))或在此特定情况下使用gzip -cd file.gz | head -c $(512)。关于最初的dd依赖于1024中的gzip解压缩的评论似乎并不正确。例如,dd ibs=2 count=10解压前20个字节。

票数 19
EN

Stack Overflow用户

发布于 2014-05-15 18:59:33

是的,这是可能的。

但不要重复发明轮子,HDF5数据库支持不同的压缩算法(其中包括gz),您可以处理不同的部分。它与Linux和Windows兼容,并且有多种语言的包装器。它还支持并行读取和解压缩,如果您使用高压缩率,这将非常有用。

以下是从Python到PyTables使用不同压缩算法的读取速度的比较:

票数 4
EN

Stack Overflow用户

发布于 2018-01-10 22:46:11

Deflate流可以有多个背靠背的块。但是你总是可以只解压缩你想要的字节数,即使它是一个更大的块的一部分。zlib函数gzread接受一个长度arg,还有各种其他方法可以解压缩特定数量的纯文本字节,而不管整个流有多长。有关函数的列表以及如何使用它们,请参阅the zlib manual

还不清楚你是否只想修改头文件。(您提到重新压缩整个文件,但选项B不会重新压缩任何内容)。如果是这样,请在单独的Deflate块中写入标头,以便您可以替换该块,而无需重新压缩图像的其余部分。当您调用zlib deflate函数来写入头文件时,使用Z_FULL_FLUSH。您可能不需要在任何地方记录头的压缩长度;我认为可以在读取它们时计算它,以确定要替换哪些字节。

如果你没有修改任何东西,重新压缩整个文件是没有意义的。你可以在找到你喜欢的头文件后重新开始解压...

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23676116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档