2011-10-26 13 views
3

私は大gzipファイルを処理しようとしているこれら二つのstackoverflowの質問からurllib2のとZLIBと技術を使用して、Pythonで、インターネットから引き込ま:のpython + 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 

編集: これは、NOT urllib2の/ zlibのハンドリングで、プログラムのどこかのバグであることが判明しました。助けてくれた皆様に感謝します。大きなgzipファイルを処理する必要がある場合は、上記のコードで使用しているパターンをお勧めします。

+0

長い操作を 's'に置くと同じことが起こりますか? – chown

+0

はい、結果は同じです。 – beerbajay

+0

他の操作をtime.sleep(2)に置き換えるとどうなりますか? –

答えて

1

これは、urllib2/zlibの処理ではなく、プログラム内のバグであることが判明しました。大きなgzipファイルを処理する必要がある場合は、上記のコードで使用しているパターンをお勧めします。

1

タイムアウトが問題で、それが明らかでない場合は、コードを入力読み込み側と処理側で切り離すことができます。中央にキューを固定し、キューから読み取る別のスレッドで処理します。

チャンクサイズを小さくし、ループごとに処理する回数を減らすこともできます。

関連する問題