대용량 파일 업로드 처리 (30GB)
FastAPI에서 대용량 파일 업로드 기능을 구현해보자.
프론트엔드에서 백엔드로 요청을 보낼 때는 axios를 사용하고, FastAPI의 웹서버 구현체로는 uvicorn을 사용한다.
1. 타임아웃 설정
용량이 크다 보니 데이터를 주고받는데 시간이 많이 소요될 수 있다.
uvicorn과 axios 부분을 조작해 타임아웃 기간을 늘리자.
uvicorn app:app --timeout-keep-alive 1200
우선 uvicorn에서는 --timeout-keep-alive 속성값으로 uvicorn 서버가 클라이언트와의 비활성 HTTP 연결을 얼마나 오래 유지할 지 설정할 수 있다.
예시는 1200초동안 연결이 비활성화 상태로 유지되면 자동으로 닫히도록 설정한다.
upload_axios_timeout: 1200000
const api = axios.create({
baseURL: api_url,
timeout: settings.upload_axios_timeout,
withCredentials: true,
})
axios에서는 timeout 옵션으로 요청이 얼마나 오랫동안 대기할 수 있는지 설정할 수 있다.
서버 측 요청 처리에 걸리는 시간과 클라이언트 측 요청 처리에 걸리는 시간을 일치시켜 네트워크 리소스 낭비를 줄이자.
2. 스트리밍 방식 사용
# 기존 방식
with open(file_path, 'wb') as buffer:
buffer.write(upload_file.file.read())
# 스트리밍 방식
with open(file_path, 'wb') as buffer:
while True:
chunk = upload_file.file.read(1000000) # 1MB씩
if not chunk:
break
buffer.write(chunk)
기존 방식에서는 전체 파일 내용을 한 번에 메모리로 읽어들이고 파일 시스템에 한 번에 쓰고 있다.
대용량 파일인 경우 시스템의 메모리 리소스에 부담을 줄 수 있다.
스트리밍 방식에서는 파일을 chunk 단위로 나누고 순차적으로 읽은 후 파일 시스템에 쓰는 방식을 사용한다.
큰 파일도 작은 부분으로 나누어 처리하는 분할정복 기법을 사용해 메모리 사용량을 줄일 수 있다.
반응형
'Solutions' 카테고리의 다른 글
[Spring Security] 인증 실패 오류 다루기 (0) | 2024.06.20 |
---|---|
[SQL Server] 지원하지 않는 TLS 버전 설정 (1) | 2024.06.05 |
[JavaScript] Shadow DOM 다루기 (0) | 2023.11.22 |
[Vue] map 함수와 Vue3의 반응형 시스템 (0) | 2023.11.16 |
[Git] Git 협업 시 충돌 해결 (1) | 2023.11.14 |
댓글
이 글 공유하기
다른 글
-
[Spring Security] 인증 실패 오류 다루기
[Spring Security] 인증 실패 오류 다루기
2024.06.20 -
[SQL Server] 지원하지 않는 TLS 버전 설정
[SQL Server] 지원하지 않는 TLS 버전 설정
2024.06.05 -
[JavaScript] Shadow DOM 다루기
[JavaScript] Shadow DOM 다루기
2023.11.22 -
[Vue] map 함수와 Vue3의 반응형 시스템
[Vue] map 함수와 Vue3의 반응형 시스템
2023.11.16