2011-10-26 5 views
3

내가 큰 GZIP 파일을 처리하기 위해 노력하고있어이 두 가지 유래 질문에서 urllib2가와 ZLIB와 기술을 사용하여 파이썬에서 인터넷에서 가져온 :파이썬 + urllib2가 : 스트리밍 조기 종료

파일의 각 청크를 읽은 후에 많은 분할 및 반복 작업이 필요한 결과 문자열에 대해 몇 가지 작업을 수행해야한다는 점을 제외하면이 방법이 유용합니다. 이것은 약간의 시간이 걸리며 코드가 다음 req.read()을 수행 할 때 아무것도 반환하지 않고 프로그램이 끝나고 첫 번째 청크 만 읽습니다.

다른 작업을 주석 처리하면 전체 파일을 읽고 압축을 해제합니다. 코드 :

d = zlib.decompressobj(16+zlib.MAX_WBITS) 
CHUNK = 16 * 1024 
url = 'http://foo.bar/foo.gz' 
req = urllib2.urlopen(url) 
while True: 
    chunk = req.read(CHUNK) 
    if not chunk: 
     print "DONE" 
     break 
    s = d.decompress(chunk) 
    # ... 
    # lots of operations with s 
    # which might take a while 
    # but not more than 1-2 seconds 

아이디어가 있으십니까?

편집 : 이것은 urllib2/zlib 처리가 아닌 프로그램의 다른 곳에서 버그로 밝혀졌습니다. 도와 주신 모든 분들께 감사드립니다. 대형 gzip 파일을 처리해야하는 경우 위의 코드에서 사용 된 패턴을 권장 할 수 있습니다.

+0

's'에 긴 연산을 넣을 때도 똑같은 일이 발생합니까? – chown

+0

예, 결과는 같습니다. – beerbajay

+0

다른 작업을 time.sleep (2)로 바꾸면 어떻게됩니까? –

답변

1

이것은 urllib2/zlib 처리가 아니라 프로그램의 다른 곳에서 버그로 밝혀졌습니다. 대형 gzip 파일을 처리해야하는 경우 위의 코드에서 사용 된 패턴을 권장 할 수 있습니다.

1

시간 초과가 문제이고 이것이 확실하지 않은 경우 중간에 대기열을 고정하고 대기열에서 읽는 다른 스레드에서 처리를 수행하여 코드의 입력 읽기 및 처리면을 분리 할 수 ​​있습니다 .

또한 청크 크기를 작게 만들 수 있고 루프 당 처리량을 줄일 수 있습니다.

관련 문제