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

如果超时是问题,并且不清楚它是什么,那么可以通过在中间插入一个队列并在另一个从队列读取的线程中执行处理,从而将代码的输入读取和处理端分开。

您还可以使您的块大小更小,并且每个循环的处理更少。