Я написал скрипт на Python, который использую для загрузки большого количества видеофайлов (50-400 МБ каждый) из HTTP сервер. До сих пор он хорошо работал с длинными списками загрузок, но по какой-то причине он редко имеет ошибку памяти.
На машине свободно около 1 ГБ ОЗУ, но я не думаю, что он когда-либо исчерпывал ОЗУ при запуске этого сценария.
Я ' ve следил за использованием памяти в диспетчере задач и perfmon, и он всегда ведет себя так же, как я видел: медленно увеличивается во время загрузки, затем возвращается на нормальный уровень после завершения загрузки (нет мелких утечек, которые подкрадываются или что-то еще
При загрузке создается файл, размер которого остается 0 КБ до завершения загрузки (или сбоя программы), затем выполняется запись всего файла сразу и его закрытие.
for i in range(len(urls)):
if os.path.exists(folderName + '/' + filenames[i] + '.mov'):
print 'File exists, continuing.'
continue
# Request the download page
req = urllib2.Request(urls[i], headers = headers)
sock = urllib2.urlopen(req)
responseHeaders = sock.headers
body = sock.read()
sock.close()
# Search the page for the download URL
tmp = body.find('/getfile/')
downloadSuffix = body[tmp:body.find('"', tmp)]
downloadUrl = domain + downloadSuffix
req = urllib2.Request(downloadUrl, headers = headers)
print '%s Downloading %s, file %i of %i'
% (time.ctime(), filenames[i], i+1, len(urls))
f = urllib2.urlopen(req)
# Open our local file for writing, 'b' for binary file mode
video_file = open(foldername + '/' + filenames[i] + '.mov', 'wb')
# Write the downloaded data to the local file
video_file.write(f.read()) ##### MemoryError: out of memory #####
video_file.close()
print '%s Download complete!' % (time.ctime())
# Free up memory, in hopes of preventing memory errors
del f
del video_file
Вот трассировка стека:
File "downloadVideos.py", line 159, in <module>
main()
File "downloadVideos.py", line 136, in main
video_file.write(f.read())
File "c:\python27\lib\socket.py", line 358, in read
buf.write(data)
MemoryError: out of memory