私はasyncioを使ってネットワーク上で大きなログファイルをストリーミングしたいと思っています。私はデータベースからデータを取り出し、フォーマットし、pythonのzlibを使って圧縮し、ネットワーク上でストリームします。ここでPythonでオンザフライで構築されたgzipをストリーミングする方法は?
は基本的に私が使用するコードです:
@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