2016-06-21 8 views
0

asyncio를 사용하여 네트워크를 통해 큰 로그 파일을 스트리밍하고 싶습니다. 데이터베이스에서 데이터를 검색하여 형식을 지정하고 python의 zlib을 사용하여 압축 한 다음 네트워크를 통해 스트리밍합니다.파이썬에서 즉시 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 스트림 대신 원시 스트림을 사용했다면 여전히 gzip 트레일러를 작성하지 않았을 것입니다.

이렇게하려면 gzip 헤더를 직접 작성하지 마십시오. 대신 zlib에 올바른 헤더, 압축 된 데이터 및 트레일러를 쓸 완전한 gzip 스트림을 작성하도록 요청하십시오. 31부터 compressobj()까지 wbits 값을 제공하면됩니다.