2016-06-01 3 views
1

Я пишу сценарий, который загружает некоторые видео из Dropbox. Обычно моя скорость загрузки составляет около 150 кб/с, это при использовании обычного загрузчика в firefox или IDM. Но при использовании этого скрипта Python все становится слишком медленным: менее 10 кб/сек.Увеличьте скорость загрузки запросов

Вот код, я использую:

def download(url,i): 
    local_filename = "video_" + str(i) + ".mp4" 
    # NOTE the stream=True parameter 
    r = requests.get(url, stream=True) 
    with open(local_filename, 'wb') as f: 
     n = 0 
     for chunk in r.iter_content(chunk_size=1000000): 
      if chunk: # filter out keep-alive new chunks 
       n = n +1 
       f.write(chunk) 
       print "downloading " + str(n) 
       f.flush() 
    return local_filename 

Есть в любом случае я мог бы ускорить загрузку?

+0

Любопытно, как вы рассчитываете скорость загрузки в вашем скрипте? – CaffeineAddiction

+2

Вы пробовали установить chunk_size в None вместо того, чтобы передавать число. Я считаю, что это позволяет iter_content определять объем содержимого для загрузки в память перед его итерацией на нем. Кажется, что вы загружаете много в память, прежде чем выполнять какую-либо работу. – reticentroot

ответ

0

Я считаю, что 1000000mb является большой величиной для загрузки за один раз. Вы ничего не можете сделать с куском, пока все эти данные буферизуются в память. Я бы уменьшил размер до 512 МБ или 1 гб, если размер файла меньше 512 МБ, а размер блока должен быть меньше этого, иначе вы не загружаете куски, а весь файл ... все равно, если вы будете искать в сети a бит, вы увидите, что его горячая тема обсуждается. Пример кода:

def download(url,i): 
    local_filename = "video_" + str(i) + ".mp4" 
    with open(local_filename, 'wb') as f, closing(requests.get(url, stream=True)) as res: 
     for n, chunk in enumerate(res.iter_content(chunk_size=512), start=1): 
      f.write(chunk) 
      print "downloading " + str(n) 
    return local_filename 

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

+1

Операторы 'with' поддерживают несколько контекстов, разделенных запятыми, поэтому вы можете делать' с открытым (...) как f, закрывая (...) как res: 'вместо двух вложенных блоков. Также, если вы предлагаете улучшения, вы можете использовать 'enumerate' для обработки значения' n'. –

+0

@ TadhgMcDonald-Jensen Я этого не осознавал! Спасибо за это! – reticentroot

+0

Вы можете добавить 'start = 1' в' enumerate', чтобы он начинал отсчет с 1 –

Смежные вопросы