能否做到针对已按常规压缩的大尺寸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以后,每次循环均报错

阅读 3k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题