이 영역을 누르면 첫 페이지로 이동
천천히 꾸준히 조용히 블로그의 첫 페이지로 이동

천천히 꾸준히 조용히

페이지 맨 위로 올라가기

천천히 꾸준히 조용히

천천히 꾸준히 조용히.. i3months 블로그

대용량 파일 업로드 처리 (30GB)

  • 2023.12.03 13:05
  • 💡 솔루션
반응형

 

 

 

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 단위로 나누고 순차적으로 읽은 후 파일 시스템에 쓰는 방식을 사용한다.

큰 파일도 작은 부분으로 나누어 처리하는 분할정복 기법을 사용해 메모리 사용량을 줄일 수 있다.

 

 

 

 

 

 

반응형
저작자표시 (새창열림)

'💡 솔루션' 카테고리의 다른 글

[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

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [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
다른 글 더 둘러보기

정보

천천히 꾸준히 조용히 블로그의 첫 페이지로 이동

천천히 꾸준히 조용히

  • 천천히 꾸준히 조용히의 첫 페이지로 이동

검색

방문자

  • 전체 방문자
  • 오늘
  • 어제

카테고리

  • 분류 전체보기 (675) N
    • Algorithm (205)
      • Data Structure (5)
      • Theory && Tip (33)
      • Baekjoon (166)
      • ALGOSPOT (1)
    • Spring (123)
      • Spring (28)
      • Spring Web MVC (20)
      • Spring Database (14)
      • Spring Boot (6)
      • Spring 3.1 (11)
      • Spring Batch (6)
      • Spring Security (16)
      • JPA (12)
      • Spring Data JPA (5)
      • QueryDSL (4)
      • eGovFramework (1)
    • Programming Language (74)
      • C (25)
      • C++ (12)
      • Java (19)
      • JavaScript (15)
      • Python (1)
      • PHP (2)
    • Computer Science (142)
      • Machine Learning (38)
      • Operating System (18)
      • Computer Network (28)
      • System Programming (22)
      • Universial Programming Lang.. (8)
      • Computer Architecture (4)
      • Compiler Design (11)
      • Computer Security (13)
    • Database (21)
      • Database (7)
      • MySQL (3)
      • Oracle (3)
      • Redis (5)
      • Elasticsearch (3)
    • DevOps (20)
      • Docker && Kubernetes (8)
      • Jenkins (4)
      • Amazon Web Service (8)
    • Mobile (28)
      • Android (21)
      • Flutter (7)
    • 💡 솔루션 (17)
    • 👥 모각코 (8)
    • 💬 기록 (7) N
    • 📚 공부 (5)
    • -------------- (25)

최근 글

나의 외부 링크

메뉴

  • 홈
반응형

정보

i3months의 천천히 꾸준히 조용히

천천히 꾸준히 조용히

i3months

블로그 구독하기

  • 구독하기
  • RSS 피드

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. Copyright © i3months.

티스토리툴바