2016-06-21 8 views
0

私は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 

答えて

1

あなたのgzipヘッダが間違っています( 10ではなく8バイト)、別のヘッダーとトレーラーを使用するzlibストリームで追跡します。正しいgzipヘッダーがあっても、gzipストリームの代わりにraw deflate streamがあったとしても、まだgzipの予告編を書いていないでしょう。

これを正しく行うには、独自のgzipヘッダーを記述しないでください。代わりに、zlibに完全なgzipストリームを書き出して、正しいヘッダ、圧縮データ、および予告編を書き込むように要求してください。 31compressobj()の値をwbitsとすることで、これを行うことができます。

関連する問題