Подтвердить что ты не робот

Python распаковывает gzip chunk-by-chunk

У меня есть среда с ограничениями на память и диск, где мне нужно распаковать содержимое файла gzip, отправленного мне в строках на основе строк (через двоичную передачу xmlrpc). Однако, используя zlib.decompress() или zlib.decompressobj()/dempress(), оба 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, а затем использовать это как файл для gzip.GzipFile(), однако в реальной жизни у меня нет памяти для хранения всего содержимого файла в памяти, а также распакованных данных. Мне действительно нужно обработать этот фрагмент.

Отказ будет заключаться в том, чтобы изменить сжатие моих данных xmlrc-sourced от gzip до простого zlib, но поскольку это влияет на другие подсистемы, я бы предпочел избежать его, если это возможно.

Любые идеи?

4b9b3361

Ответ 1

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

См. Как я могу распаковать поток gzip с помощью zlib?

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

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