2016-06-21 26 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頭是錯誤的( 8個字節,而不是10個),並且您使用zlib流跟蹤它,該流使用不同的頭部和尾部。即使你有一個正確的gzip頭,如果你有一個原始的deflate流而不是gzip流,你仍然沒有寫一個gzip預告片。

要做到這一點,不要試圖編寫自己的gzip標題。而是要求zlib寫一個完整的gzip流,它將寫入正確的標題,壓縮數據和預告片。您可以通過提供wbits的值31compressobj()來完成此操作。