[컴][파이썬] flask 에서 응답으로 큰 data 를 만들어서 줘야 할 때




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 rows
sheet2 : 1575 columns * 169 rows

  • XlsxWriter : 약 2분(IDE 디버그 모드)
  • PyExcelerate : 약 30~40초(IDE 디버그 모드), 그냥 .py 를 돌렸을 경우  약10초 정도로 줄어듦


Asynchronous response

  1. Going asynchronous: from Flask to Twisted Klein
  2. python - Why use Tornado and Flask together? - Stack Overflow
flask 에서 기본적으로 제공하는 WSGI container Werkzeug 는 blocking IO 이다. 여하튼 그 자체 web server 는 개발용으로 사용하고 배포(deploy) 용으로는 다른 web server 를 사용하라고 한다. 아직 사용은 안해봤지만 Tornado 를 사용하면 될 듯 하다.







See Also

  1. Outputting CSV with Django > Using the template system
  2. 파이썬 엑셀 쓰기 라이브러리 비교


References

  1. Streaming Contents — Flask Documentation (0.10)
  2. python - flask make_response with large files - Stack Overflow

댓글 없음:

댓글 쓰기