0

我想使用 asyncio 在网络上流式传输一个大日志文件。我从数据库中检索数据,对其进行格式化,使用 python 的 zlib 对其进行压缩并通过网络将其流式传输。

这里基本上是我使用的代码:

@asyncio.coroutine
def logs(requests):
    # ...

    yield from resp.prepare(request)

    # gzip magic number and compression format
    resp.write(b'\x1f\x8b\x08\x00\x00\x00\x00\x00')
    compressor = compressobj()
    for row in rows:
        ip, uid, date, url, answer, volume = row
        NCSA_ROW = '{} {} - [{}] "GET {} HTTP/1.0" {} {}\n'
        row = NCSA_ROW.format(ip, uid, date, url, answer, volume)
        row = row.encode('utf-8')
        data = compressor.compress(row)
        resp.write(data)
    resp.write(compressor.flush())
    return resp

我检索到的文件无法使用 gunzip 和 zcat 打开引发以下错误:

gzip: out.gz: unexpected end of file
4

1 回答 1

1

您的 gzip 标头是错误的(8 个字节而不是 10 个),并且您使用一个使用不同标头和预告片的 zlib 流跟随它。即使您有正确的 gzip 标头,并且如果您有原始的 deflate 流而不是 gzip 流,您仍然不会编写 gzip 预告片。

要做到这一点,请不要尝试编写自己的 gzip 标头。而是请求 zlib 写入一个完整的 gzip 流,这将写入正确的标头、压缩数据和预告片。您可以通过提供 to 的wbits31来做到这一点compressobj()

于 2016-06-21T16:19:35.823 回答