나는 boost :: asio를 사용하여 HTTP 서버를 작성하고있다. 대용량 파일의 경우 전체 파일을 메모리로 읽어 들이지 않고 네트워크로 보내는 것을 피하기 위해 boost :: asio :: async_write를 사용하여 네트워크에서 보내는 부분별로 읽습니다.boost :: async_write 대용량 파일 및 메모리 사용량
문제는 제작자 (파일에서 읽는 함수)가 소비자 (boost :: asio :: async_write)보다 훨씬 빠르기 때문에 큰 파일에 대해 막대한 메모리를 소비한다는 것입니다.
버퍼 목록을 제한하여이 문제를 방지하고 싶습니다. 그것은 단순한 생산자/소비자 문제처럼 보이지만 그렇게하는 동안 스레드를 차단하고 싶지는 않습니다.
구성 가능한 n 스레드의 스레드 풀과 함께 boost :: io_service를 사용합니다. 대용량 파일에 대해 너무 많은 요청이있는 경우 더 이상 요청을 처리하지 않는 서버로 끝내고 싶지 않습니다.
내 질문은 : - 스레드를 차단하지 않고이 메커니즘을 어떻게 디자인 할 수 있습니까? - 목록 크기를 테스트해야하고 이미 너무 큰 경우 io_service :: post를 수행하고 내 파일을 계속 읽는 마감 타이머를 생성 하시겠습니까? - 더 나은 방법이 있습니까?
음. async_write를 통해 N 바이트를 전송한다고 가정합니다. async_write를 시작하고 동시에 파일에서 다음 N 바이트를 읽습니다 (2 작업 게시). 그런 다음 async_write가 끝나면 같은 작업을 반복하십시오. 따라서 아직 보내지 않은 파일 파트는 메모리에 보관하지 않습니다. –