2011-10-26 58 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

如果超時是問題,並且不清楚它是什麼,那麼可以通過在中間插入一個隊列並在另一個從隊列讀取的線程中執行處理,從而將代碼的輸入讀取和處理端分開。

您還可以使您的塊大小更小,並且每個循環的處理更少。