flask 에서 응답으로 큰 string 을 줘야 한다면...
만약 request(요청)에 대한 응답(response) 로 큰 data 를 넘겨줘야 한다면, generators 와 direct responses 를 이용해서 메모리에 큰 부하를 주지 않고 응답을 줄 수 있다.만약 파일을 보내려고 한다면 send_from_directory() 를 이용할 수 있다.[ref. 2]
큰 size 의 csv
큰 용량? 의 csv 를 만들려고 할 때도 이 방법이 필요하다. csv 를 string 으로 처리해서 결과를 return 하려고 하면, 1MB 정도의 string 작업을 하는데에도 1분정도의 시간이 걸린다. 체감속도가 너무 안좋다.하지만 generator 를 이용하면 바로 download 가 시작된다.
flask_excel
flask_excel 도 사용해봤지만, 내부적으로 StringIO 를 사용하고 있었는데, 큰 속도개선이 없었다. 만약 string 처리를 c/c++ library 로 따로 하는 library 가 있다면 generator 보다 속도가 빠를 수는 있을 듯 하다..xlsx 파일 response
.xlsx 을 local 에 임시로 file를 만들고 이녀석을 response 로 serve 하는 방식을 택했다. 그래서 local 에서 .xlsx file 을 생성하는 속도에 따라 response 속도가 달라졌다.
몇가지 module 을 테스트해 봤는데, 여러모로 xlsxWriter 가 기능이 좋아서 사용하려고 했는데, 큰 file 을 써야하는 경우에 속도가 만족스럽지 못했다. 그래서 찾다가 pyexcelerate 를 reddit 에서 추천해서 써봤다. see also. 2 에서 얘기하듯이 간단한 형식의 대용량 파일에는 pyexcelerate 이 좋은 듯 하다.
local file system 에 .xlsx 생성 속도 비교
sheet1 : 5 columns * 788 rowssheet2 : 1575 columns * 169 rows
- XlsxWriter : 약 2분(IDE 디버그 모드)
- PyExcelerate : 약 30~40초(IDE 디버그 모드), 그냥 .py 를 돌렸을 경우 약10초 정도로 줄어듦
Asynchronous response
- Going asynchronous: from Flask to Twisted Klein
- python - Why use Tornado and Flask together? - Stack Overflow
See Also
- Outputting CSV with Django > Using the template system
- 파이썬 엑셀 쓰기 라이브러리 비교
댓글 없음:
댓글 쓰기