我有一个非常大的文件压缩与gzip坐在磁盘上.生产环境基于"云",因此存储性能很差,但CPU很好.以前,我们的数据处理流程始于gzip -dc从磁盘上传输数据.
现在,为了并行工作,我想运行多个管道,每个管道都需要一对字节偏移 - 开始和结束 - 并获取该文件的块.使用普通文件,这可以通过head和实现tail,但我不知道如何使用压缩文件有效地完成它; 如果我gzip -dc和管道进入head,文件末尾的偏移对将涉及浪费地搜索整个文件,因为它慢慢解压缩.
所以我的问题实际上是关于gzip算法 - 理论上是否有可能在底层文件中寻找一个字节偏移量或得到它的任意一块,而没有解压缩整个文件到那一点的全部含义?如果没有,我可以如何有效地将文件分区为多个进程的"随机"访问,同时最小化I/O吞吐量开销?
可能重复:
如何在不读取其全部内容的情况下拖尾压缩文件?
我有一个7GB的gzip syslog文件,提取到超过25GB.我需要只检索文件的第一行和最后一行,而不是一次将整个文件读入内存.
GzipFile()在Python 2.7中允许使用with读取头部(迭代通过with意味着我不必读取整个文件):
>>> from itertools import islice
>>> from gzip import GzipFile
>>> with GzipFile('firewall.4.gz') as file:
... head = list(islice(file, 1))
>>> head
['Oct 2 07:35:14 192.0.2.1 %ASA-6-305011: Built dynamic TCP translation
from INSIDE:192.0.2.40/51807 to OUTSIDE:10.18.61.38/2985\n']
Run Code Online (Sandbox Code Playgroud)
Python的2.6版本,以避免如问题AttributeError: GzipFile instance has no attribute '__exit__'(因为GzipFile中()不支持with迭代的GzipFile中())...
>>> from itertools import islice
>>> from gzip import GzipFile
>>> class GzipFileHack(GzipFile):
... def __enter__(self):
... return self …Run Code Online (Sandbox Code Playgroud)