Kinect v2의 색상, 적외선 및 깊이 데이터를 버퍼링하고 일부 처리를 수행 한 다음 압축되지 않은 형태로 디스크에 덤프하는 .NET 4.5 응용 프로그램을 작성했습니다. .NET 응용 프로그램은 하위 프로세스로 ffmpeg를 시작하고 H.264로 인코딩되도록 색상 데이터를 파이프합니다.
SSD를 사용하지 않기 때문에 비디오 데이터가 디스크에 쓸 수있는 것보다 빨리 도착합니다. 그러나 괜찮습니다 .RAM이 적을 때 비디오 프레임을 버리는 것이 허용됩니다. 내 유일한 요구 사항은 내가 유지하는 모든 것이 8-10 초의 비디오 청크에 인접해야한다는 것입니다. 따라서 8 ~ 10 초의 비디오 (약 1.5 ~ 2GB)를 버퍼링하기에 충분한 RAM이 없을 때 비디오 프레임을 삭제하기 위해 .NET 4.5 응용 프로그램에 몇 가지 논리를 추가했습니다.
그리고 페이지 스 래싱을 방지하기 위해 페이징 파일을 완전히 비활성화했습니다. 이로 인해 총 16GB의 실제 RAM이 남습니다.
내 문제는 해당 메커니즘을 사용하더라도 Windows 8.1에서 RAM이 부족하다는 사실을 알면 때로는 .NET 응용 프로그램 또는 ffmpeg 하위 프로세스가 여전히 종료되는 것입니다. 디스크에 쓸 수 있습니다. Windows가 중요하지 않은 프로세스를 먼저 종료하기 위해 내 프로세스가 다른 프로세스보다 중요하다는 것을 Windows에 알리는 방법이 있습니까?
답변
모든 RAM이 사용될 때 Windows는 프로세스를 종료하지 않습니다. 실제로 발생하는 것은 프로세스가 메모리를 할당하지 못하고 충돌하는 것입니다.
이것은 모든 실제 메모리가 사용 중이고 페이지 파일이 비활성화되어 메모리 관리자가 더 이상 사용되지 않는 페이지를 쓸 수 없기 때문에 발생합니다. 이렇게하면 실제 RAM이 가득 차고 프로세스 또는 그 밖의 다른 작업이 페이지 할당을 시도하면 실패합니다. 일부 응용 프로그램이 충돌합니다.
Technet의이 프레젠테이션은 다음과 같이 설명합니다.
http://channel9.msdn.com/Events/TechEd/NorthAmerica/2011/WCL405
페이지 파일은 초과 커밋에 대한 백스톱 역할을하여 모든 메모리를 활용할 때 응용 프로그램이 중단되는 것을 방지합니다.
가상 메모리는 최신 운영 체제가 리소스를 할당하는 방식의 근간이되므로 사용중인 RAM에 물건을 넣고 디스크에서 물건을주고받는 것입니다.
실제로 두 가지 답변이 있습니다.
- 디스크 스 래싱을 줄이려면 페이지 파일을 다시 활성화하고 컴퓨터의 RAM을 늘리십시오.
- 응용 프로그램의 메모리 요구 사항을 줄이십시오.
결론적으로 RAM은 캐시의 또 다른 수준이며 가상 메모리, 페이지 파일, 메모리 매핑 파일 및 기본적으로 이것에 이르는 모든 것들입니다. 메모리가 부족하면 추가해야합니다. 더.
답변
Windows 도구 패널 및 고급 설정을 통해 이동하고 필요없는 창 효과와 같은 불필요한 항목을 비활성화하고 Sysinternals Process Explorer 및 / 또는 시스템 모니터를 통해 CPU 또는 메모리를 낭비하는 외부 항목을 찾아 끄십시오.
더 중요한 것은 Process Explorer 및 / 또는 System Monitor를 사용하여 프로그램이 실행 중인지 확인하고 실패한 위치 및 방법을 정확히 확인하십시오. 메인 스레드 또는 ffmpeg 파트 중 어느 스레드가 메모리 부족으로 먼저 죽습니까? 예상치 못한 크기로 확장되는 특정 dll 또는 기타 공유 리소스가 있습니까? 아니면 데이터를 씹을 수있는 것보다 더 많이 물린 것을 제외하고는 실행이 올바르게 진행되고 있습니까?
문제의 본질을보다 정확하게 파악하면 해결 방향을 제시 할 수 있습니다. 예를 들어, 프레임 삭제 정책을보다 적극적으로 구현하면서 8-10 초 청크 기준에 맞게 최적화하여 전반적인 RAM 오버 헤드를 줄일 수 있습니다.
최종 제안 : 아마도 리눅스로 전환하는 것을 고려하고 그 동안 페이징 파일을 다시 활성화하십시오 (리눅스가 스왑 공간이라고 부르므로 스왑 만남과 같은 IMHO가 더 재미있게 들립니다!) 행운을 빈다.