Python распаковывает gzip чанк за чанк - PullRequest
32 голосов
/ 11 марта 2010

У меня ограниченная память и диск среда, в которой мне нужно распаковать содержимое gzip-файла, отправленного мне в виде кусочков на основе строк (через двоичную передачу xmlrpc). Однако, используя zlib.decompress () или zlib.decompressobj () / depress (), оба barf над заголовком gzip. Я пытался сместить за пределы заголовка gzip (задокументировано здесь ), но все еще не удалось избежать barf. Сама библиотека gzip поддерживает только распаковку из файлов.

Следующий фрагмент дает упрощенную иллюстрацию того, что я хотел бы сделать (за исключением того, что в реальной жизни буфер будет заполняться из xmlrpc вместо чтения из локального файла):

#! /usr/bin/env python

import zlib

CHUNKSIZE=1000

d = zlib.decompressobj()

f=open('23046-8.txt.gz','rb')
buffer=f.read(CHUNKSIZE)

while buffer:
  outstr = d.decompress(buffer)
  print(outstr)
  buffer=f.read(CHUNKSIZE)

outstr = d.flush()
print(outstr)

f.close()

К сожалению, как я уже сказал, это barfs с:

Traceback (most recent call last):
  File "./test.py", line 13, in <module>
    outstr = d.decompress(buffer)
zlib.error: Error -3 while decompressing: incorrect header check 

Теоретически, я мог бы передать свои данные из xmlrpc в StringIO, а затем использовать их как fileobj для gzip.GzipFile (), однако в реальной жизни у меня нет доступной памяти для хранения всего содержимого файла в память, а также распакованные данные. Мне действительно нужно обрабатывать его по частям.

В качестве альтернативы можно было бы изменить сжатие моих исходных данных xmlrpc с gzip на обычный zlib, но, поскольку это влияет на другие подсистемы, я бы предпочел избежать этого, если это возможно.

Есть идеи?

Ответы [ 2 ]

41 голосов
/ 11 марта 2010

gzip и zlib используют несколько разные заголовки.

См. Как мне распаковать поток gzip с помощью zlib?

Попробуйте d = zlib.decompressobj(16+zlib.MAX_WBITS).

И вы можете попытаться изменить размер куска на степень 2 (скажем, CHUNKSIZE=1024) по возможным причинам производительности.

3 голосов
/ 11 марта 2014
...