나만의 무기 : HIGHLIGHTING/개발 일지

Day 23 (1) : 영상 소분 처리로 RAM 사용량 개선

정글러 2022. 2. 26. 03:25

우리 서버측의 가장 큰 문제, 메모리 소모량

5시간짜리 영상 하나만 요청이 들어와도 램을 5기가씩 먹으니 아마존 인스턴스로 배포하긴 무리가 있다.

 

무지막지한 램 소모량의 원인은 numpy를 이용한 rawdata의 계산 때문이다.

 

영상의 픽셀이나 음원의 파형을 numpy로 분석하는데,

영상의 rawdata를 램에 올린다는 것은 무압축 영상을 램에 통째로 올리는 것과 동치이니 램이 훅갈수밖에 없다...

 

메모리 소모량은 당연히 영상의 시간에 비례한다.

그렇다면 영상을 소분해서 파일화하고, 그때그때 당장 계산할 일부분만 램에 올리는 것으로

쓸데없이 계산 전, 후로 램에 올라가있는 부분들을 내려놓게 되어 효율 개선이 가능할 것

 

물론 영상을 작은 단위로 자르는 데에 시간은 더 들겠지만,

FFmpeg의 cut을 이용하면 재인코딩을 하지 않아서 거의 상수 시간(아마도 디스크 복사에 드는 시간만)에 가능하다.

원래는 FFmpeg-python 라이브러리를 쓰다보니 버그때문에 못쓰던 커맨드지만

어제 OS로 FFmpeg을 다루는 법을 익힌 덕에 이젠 만들 수 있다.

 

 

ffmpeg 명령에 hhmmss형식의 구간 입력이 필요하니 int를 str로 바꿔주는 함수를 만들고

그 함수를 이용해 input file의 i번째 소분된 부분을 추출하는 명령을 달리는 함수를 만들었다

이를 while문 안에서 돌리면 

4시간 조금 안되는 영상이 10분짜리 영상 24개로 분할되었다.

근데 저렇게 쌓아두는것도 일종의 비효율이니 필요한 구간만 뽑고 지우고를 반복하게 고침

 

분할이 잘 되는건 로컬에서 확인했으니, 이제 서버에서 돌아가는 과정에 위 로직을 추가하고,

각각 영상, 오디오 프로세스를 수행한다음 부분파일을 지우는 절차까지 추가하면

메모리 소모량을 1/n로 줄일 수 있을 것

 

근데 서버 레포지토리에서 작업하니까 이것저것 말썽이 많아서 몸을 많이 비틀었다...

ffmpeg 실행 위치나 추출한 영상파일이 보관된 위치라든가

 

아무튼 구현완료

 

(좌, before) Process가 끝나자 메모리 반납하면서 12GB -> 7.1GB

(우, after) 7.4GB니까 200~300메가정도 쓰는것 같다. 편-안

 

238분 영상을 24등분했으니 대략 5기가에서 200메가로 1/24로 줄어든 것이 계산과도 얼추 맞다.

 

우리도 이제 AWS에 배포할 수 있어...

 

아직 3시다

차트 담당 팀원의 마지막 구현 목표인 superchat과 keywords검색을 위한 알고리즘을 만들다 가야겠다