14

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

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

是否可以读取 .gz 文件的第一段(比如几个 K),解压缩该段并读取原始内容?我对gz的理解是,在开始记账之后,压缩数据是按顺序存储的——对吗?

所以不是
1. 打开大文件F
2. 解压大文件F
3. 读取 500 字节的头文件
4. 重新压缩大文件F


1. 打开大文件F
2. 从流中读取前 5 K 3.作为F流解压缩 4. 从中读取 500 字节的标头A
AB
B

我正在使用libz.so,但其他语言的解决方案表示赞赏!

4

3 回答 3

20

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

gzip -cd解压到标准输出。

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

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

并且count=10只复制 10 个输入块,从而停止 gzip 解压缩。

您需要gzip -cd file.gz | dd count=1使用标准的 512 块大小,而忽略额外的 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 个字节。

于 2015-02-06T10:05:24.550 回答
4

是的,有可能。

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

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

阴谋

于 2014-05-15T10:59:32.543 回答
0

Deflate 流可以有多个背靠背的块。但是你总是可以只解压缩你想要的字节数,即使它是一个更大块的一部分。zlib 函数gzread采用长度 arg,并且有多种其他方法可以解压缩特定数量的纯文本字节,无论完整流有多长。有关功能列表以及如何使用它们,zlib参阅手册。

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

如果您不修改任何内容,则重新压缩整个文件是没有意义的。找到喜欢的标头后,您可以从头开始寻找并重新解压缩...

于 2018-01-10T14:46:11.250 回答