반응형
질문
Requests는 정말 좋은 라이브러리입니다. 저는 이를 사용하여 큰 파일(>1GB)을 다운로드하고 싶습니다. 문제는 전체 파일을 메모리에 유지할 수 없다는 것입니다. 파일을 청크 단위로 읽어야 합니다. 그리고 다음 코드에서 이것이 문제입니다:
import requests
def DownloadFile(url)
local_filename = url.split('/')[-1]
r = requests.get(url)
f = open(local_filename, 'wb')
for chunk in r.iter_content(chunk_size=512 * 1024):
if chunk: # 필터링하여 keep-alive 새 청크를 제외합니다.
f.write(chunk)
f.close()
return
어떤 이유로 인해 이 방식으로는 작동하지 않습니다. 파일이 저장되기 전에 여전히 응답을 메모리에 로드합니다.
답변
다음 스트리밍 코드로 인해 Python 메모리 사용량이 다운로드한 파일의 크기와 관계없이 제한됩니다:
def download_file(url):
local_filename = url.split('/')[-1]
# 아래 stream=True 매개변수에 주목하세요
with requests.get(url, stream=True) as r:
r.raise_for_status()
with open(local_filename, 'wb') as f:
for chunk in r.iter_content(chunk_size=8192):
# 만약 청크 인코딩된 응답이 있다면 주석 해제하고
# chunk_size 매개변수를 None으로 설정하세요.
#if chunk:
f.write(chunk)
return local_filename
iter_content
를 사용하여 반환된 바이트 수는 정확히 chunk_size
와 일치하지 않습니다. 이는 종종 훨씬 더 큰 임의의 숫자이며, 각 반복마다 다른 값으로 예상됩니다.
자세한 내용은 body-content-workflow와 Response.iter_content를 참조하세요.
반응형
댓글