Самый эффективный способ сохранения двоичного файла из Интернета с помощью Python 2.6? - PullRequest
1 голос
/ 17 мая 2009

Я пытаюсь загрузить (и сохранить) двоичный файл из Интернета, используя Python 2.6 и urllib.

Насколько я понимаю, read (), readline () и readlines () - это 3 способа чтения файлового объекта. Поскольку двоичные файлы на самом деле не разбиваются на символы новой строки, read () и readlines () читают весь файл в память.

Является ли выбор размера буфера произвольного чтения () наиболее эффективным способом ограничения использования памяти во время этого процесса?

т.е.

import urllib
import os

title = 'MyFile'
downloadurl = 'http://somedomain.com/myfile.avi'
webFile = urllib.urlopen(downloadurl)
mydirpath = os.path.join('c:', os.sep,'mydirectory',\
                         downloadurl.split('/')[-1])

if not os.path.exists(mydirpath):
    print "Downloading...%s" % title
    localFile = open(mydirpath, 'wb')
    data = webFile.read(1000000) #1MB at a time
    while data:
        localFile.write(data)
        data = webFile.read(1000000) #1MB at a time
    webFile.close()
    localFile.close()
    print "Finished downloading: %s" % title
else:
    print "%s already exists." % mydirypath

Я выбрал read (1000000) произвольно, потому что он работал и уменьшал использование оперативной памяти. Я предполагаю, что если бы я работал с необработанным сетевым буфером, выбор случайного количества был бы плохим, поскольку буфер мог бы работать всухую, если скорость передачи была слишком низкой. Но кажется, что urllib уже обрабатывает буферизацию более низкого уровня для меня.

Имея это в виду, хорошо ли выбрать произвольное число? Есть ли лучший способ?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 17 мая 2009

Вы должны использовать urllib.urlretrieve для этого. Он с вами справится.

1 голос
/ 17 мая 2009

Вместо того, чтобы использовать свой собственный цикл чтения-записи, вам, вероятно, следует проверить модуль shutil. Метод copyfileobj позволит вам определить буферизацию. Самый эффективный метод варьируется от ситуации к ситуации. Даже копирование одного и того же исходного файла в одно место назначения может отличаться из-за проблем с сетью.

...