为了处理存储为.gz文件的图像(我的图像处理软件可以读取.gz文件以获得更短/更小的磁盘时间/空间),我需要检查每个文件头。
头部只是每个图像开头的一个固定大小的小结构,对于没有压缩的图像,检查它是非常快的。为了读取压缩的图像,我别无选择,只能解压缩整个文件,然后检查这个头文件,这当然会减慢我的程序。
是否可以读取.gz文件的第一个片段(比方说几个K),解压缩此片段并读取原始内容?我对gz的理解是,在一开始进行一些记账后,压缩数据将按顺序存储--这是正确的吗?
因此,不是
打开大文件F
F
F
做
作为来自B的stream A
F
F的前5 K的大文件我使用的是libz.so,但其他语言的解决方案很受欢迎!
发布于 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个字节。
发布于 2014-05-15 18:59:33
是的,这是可能的。
但不要重复发明轮子,HDF5数据库支持不同的压缩算法(其中包括gz),您可以处理不同的部分。它与Linux和Windows兼容,并且有多种语言的包装器。它还支持并行读取和解压缩,如果您使用高压缩率,这将非常有用。
以下是从Python到PyTables使用不同压缩算法的读取速度的比较:

发布于 2018-01-10 22:46:11
Deflate流可以有多个背靠背的块。但是你总是可以只解压缩你想要的字节数,即使它是一个更大的块的一部分。zlib函数gzread接受一个长度arg,还有各种其他方法可以解压缩特定数量的纯文本字节,而不管整个流有多长。有关函数的列表以及如何使用它们,请参阅the zlib manual。
还不清楚你是否只想修改头文件。(您提到重新压缩整个文件,但选项B不会重新压缩任何内容)。如果是这样,请在单独的Deflate块中写入标头,以便您可以替换该块,而无需重新压缩图像的其余部分。当您调用zlib deflate函数来写入头文件时,使用Z_FULL_FLUSH。您可能不需要在任何地方记录头的压缩长度;我认为可以在读取它们时计算它,以确定要替换哪些字节。
如果你没有修改任何东西,重新压缩整个文件是没有意义的。你可以在找到你喜欢的头文件后重新开始解压...
https://stackoverflow.com/questions/23676116
复制相似问题