Использование памяти urllib во время запросов - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть следующие общие настройки для поддержки Python 2 и 3 для загрузки двоичной полезной нагрузки ~ 8 МБ:

import six

if six.PY3:
    from urllib.request import Request, urlopen
else:
    from urllib2 import Request, urlopen

def request(url, method='GET'):
    r = Request(url)
    r.get_method = lambda: method

    response = urlopen(r)

    return response

def download_payload():
    with open('output.bin', 'w') as f:
        f.write(request(URL).read())

У меня есть следующие ограничения:

  • Должно работатьна Python 2 и 3
  • У него не должно быть практически никаких зависимостей, поскольку он будет работать как модуль Ansible в различных дистрибутивах, Ubuntu, RHEL, Fedora, Debian и т. д.

Я бы хотел минимизировать использование памяти здесь, но я не вижу документации о том, как urllib работает внутри;всегда ли он читает ответ в память, или я могу выполнить ручную буферизацию на моем конце, чтобы сохранить использование памяти фиксированным при размере буфера?

Я думал о том, чтобы сделать что-то вроде этого:

def download_payload():
    with open('output.bin', 'w') as f:
        r = request(URL)
        hunk = r.read(8192)
        while len(hunk) > 0:
            f.write(hunk)
            hunk = r.read(8192)

Вопрос, с которым я сталкиваюсь, заключается в том, позволяет ли urllib буферизовать чтение таким образом, чтобы вручную управлять памятью.Есть ли на это гарантии?Я не могу найти упоминания об использовании памяти или буферизации в документах.

...