能否做到针对已按常规压缩的大尺寸gzip文件,随机访问其中某段数据,并解压出其中尽可能多的数据?
上游是压缩好的一批MB~TB级的gzip二进制文件(压缩前原数据是行文本)。然后分割成一段一段的chunk,用流传输给下游
下游得到的输入是原gzip文件的数据片段,输出是通过解压这些数据得到的原始文本。
在gzip文件中,存储的数据都是以<head><data><foot><head><data><foot>的形式组织的。其中每段<head><data><foot>相对独立 ,包含这块压缩部分的元信息和压缩过的数据。因为下游的输入不确定,无法保证开头和结尾都是压缩数据块的边界,所以无法直接解压(解压时会由于压缩数据不全而报错)
linux、python、java等系统自带的解压均使用同一套zlib库函数。这个库可以针对输入流不断的重复调用decomress()函数,并解压得到输出。因为每次循环调用时也是传入的单独数据块,所以猜测会在上次调用时保存了相应信息,从而可以成功解压下一个不完全的数据段。
现在的需求是:先针对一个压缩文件分割过的数据块,进行流式解压,并记录每个数据块的开始和结束信息(偏移量)。在下次针对某个文件某个偏移量的数据段,根据之前记录的块偏移量进行调整,从而可以顺利的对这小块数据进行解压。
部分相关代码如下:(https://stackoverflow.com/que... 有改动)
import zlib
import traceback
CHUNKSIZE=30
d = zlib.decompressobj(16 + zlib.MAX_WBITS)
f = open('test.py.gz','rb')
buffer = f.read(CHUNKSIZE)
i = 0
while buffer :
i += 1
try:
#skip two chunk
if i < 3 or i > 4:
outstr = d.decompress(buffer)
print('*'*10 + outstr + '#'*10)
except Exception, e:
print(traceback.print_exc())
finally:
buffer = f.read(CHUNKSIZE)
outstr = d.flush()
print(outstr)
f.close()
当i>=3以后,每次循环均报错
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论