파이썬의 fastapi에서 Uploadfile은 파일이 엄청나게 클 때 어떻게 관리할까요? 10기가 정도 된다고 했을 때요. UploadFile의 file이 SpooledTemporaryFile을 사용한다고 하였습니다. 파일이 매우 클 때에는 디스크의 임시 파일이 저장되는 위치에 저장하게 됩니 이 글에서는 fastapi에 대해서는 다루지 않습니다. 다만, fastapi가 매우 큰 파일에 대해서 어떻게 다루고 있고, 이를 보기 위해서 임시 파일이 저장되는 위치와, 임시 파일이 저장되는 경로를 바꾸는 방법 정도만 가이드 합니다.

 


 

 먼저, tempfile은 임시 파일을 의미합니다. gettempdir()은 임시 파일이 저장되는 위치를 가지고 옵니다.

 

 Users의 chokw의 AppData의 Local의 Temp에 있네요. 이 위치에 들어가 보겠습니다.

 

 그러면, 이상한 폴더들과 파일들이 잔뜩 있음을 알 수 있어요. 이제 8기가 정도 되는 큰 파일을 업로드 해 보겠습니다.

 

 docs에 접속해서, 큰 파일 하나를 올려봅시다. 그리고 임시 파일에 새로 올라오는 파일의 속성을 보도록 하겠습니다.

 

 tmp66r8xk6b라는 파일이 올라왔음을 알 수 있어요. 1.26기가나 되네요. 이를 메모리에 올릴 수 없다면 디스크에 올려놓고 조금씩 불러오는 전략을 쓴다는 것을 간파할 수 있어요.

 

 


 fastapi의 main.py를 봅시다. tempfile을 import 한 뒤에, tempfile.tempdir을 "tmp"로 바꿔보겠습니다.

 

 대충 요래 바꿉니다. 그러면 어떤 일이 일어날까요? 큰 파일을 업로드 할 때 임시 파일이 있는 경로가 아니라, 제가 설정한 프로젝트 루트 경로의 tmp 경로에 올라가게 됩니다.

 

 tmp7tduibwa라는 이름으로 올라갔음을 볼 수 있어요. 여기서 정리하면, 임시 파일이 올라가는 경로를 바꾸려면, tempfile을 import 한 다음에, tempfile.tempdir을 원하는 경로로 바꿔버리면 됩니다.

 

 반면에, gh5.pdf는 작은 파일입니다. 205k밖에 되지 않습니다.

 

 이 경우, 파일이 올라오지 않음을 볼 수 있어요. 이로 미루어 보았을 때, SpooledTemporaryFile은 파일의 크기가 작을 때에는 따로 임시 파일을 만들지 않고 메모리에서 관리한다는 것을 알 수 있어요. 그렇지 않으면 아래와 같이 관리한다는 것을 알 수 있어요.

 

 

 임시 파일을 저장한다.

 

 몇 바이트의 크기만큼 읽어와서 메모리에 로드한다. 생각보다 이 방식은 자주 보이니 알아두시면 좋을 지도 모르겠네요.