针对以 .gz 文件格式存储的图片(因为我的图片处理软件可以读取 .gz 格式文件,以节省磁盘空间和时间),我需要检查每个文件的头部。
头部只是每张图片起始处的一个小结构体,大小固定。对于未压缩的图片,检查头部非常快速。而对于读取压缩图片,我别无选择,只能解压整个文件然后检查头部,这当然会减慢程序运行速度。
是否可能仅读取 .gz 文件的前一段(比如几KB),解压这一段并读取原内容呢?据我对 .gz 的理解,经过初始某些簿记工作之后,压缩数据是按顺序存储的 —— 这样说正确吗?
所以,不再:
1. 打开大文件 F
2. 解压大文件 F
3. 读取 500 字节的头部
4. 重新压缩大文件 F
而改为:
1. 打开大文件 F
2. 从 F
中读取前 5K 作为流 A
3. 将 A
解压缩成流 B
4. 从 B
中读取 500 字节的头部
我使用的是 libz.so
,但也欢迎其他语言的解决方案!
dd
的这种方式取决于gzip
以1024字节的倍数写入,因为dd
是块取向的(读系统调用的数量),而不是字节取向的。请使用head -c $((1024*10))
,这种方法更简单、更高效。请参考相关的如何部分提取压缩的大型纯文本文件?。 - Peter Cordes