python + urllib2: потоковая передача заканчивается преждевременно - PullRequest
3 голосов
/ 26 октября 2011

Я пытаюсь обработать большой gzip-файл, извлеченный из интернета, в python, используя urllib2 и zlib и методы из этих двух вопросов stackoverflow:

Это прекрасно работает, за исключением того, что после чтения каждого куска файла мне нужновыполнить некоторые операции с результирующей строкой, которые требуют большого количества разбиений и повторений.Это занимает некоторое время, и когда код переходит к следующему 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.

Ответы [ 2 ]

1 голос
/ 20 марта 2012

Это оказалось ошибкой в ​​другом месте программы, НЕ в обработке urllib2 / zlib. Я могу порекомендовать шаблон, использованный в приведенном выше коде, если вам нужно обрабатывать большие файлы gzip.

1 голос
/ 26 октября 2011

Если проблема заключается в тайм-ауте, и неясно, что это так, вы можете отделить входные стороны чтения и обработки вашего кода, вставив очередь посередине и выполнив обработку в другом потоке, который читает из очереди.

Вы также можете уменьшить размер чанка и уменьшить количество обработок за цикл.

...