能否做到针对已按常规压缩的大尺寸gzip文件,随机访问其中某段数据,并解压出其中尽可能多的数据?

发布于 2022-09-05 00:37:29 字数 1365 浏览 23 评论 0

  • 上游是压缩好的一批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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文