Я написал приложение .NET 4.5, которое буферизует данные о цвете, инфракрасном диапазоне и глубине с Kinect v2, выполняет некоторую обработку и затем выгружает их на диск в несжатом виде; Приложение .NET также запускает ffmpeg в качестве подпроцесса и передает ему данные о цвете для кодирования в виде H.264.
Поскольку я не использую SSD, видеоданные поступают быстрее, чем я могу записать на диск. Но это нормально, для меня приемлемо отказаться от видеокадров, когда у меня мало оперативной памяти. Мое единственное требование состоит в том, чтобы все, что я держу, было в основном непрерывным фрагментом видео продолжительностью от 8 до 10 секунд. Поэтому я добавил некоторую логику в свое приложение .NET 4.5, чтобы начать отбрасывать видеокадры, когда у меня недостаточно ОЗУ для буферизации непрерывных 8–10 секунд видео (примерно 1,5–2 ГБ).
И, чтобы предотвратить побои страниц, я полностью отключил файлы подкачки. Это оставляет мне в общей сложности 16 ГБ физической памяти.
Моя проблема в том, что даже с этим механизмом иногда мое приложение .NET или подпроцесс ffmpeg по-прежнему погибают, когда Windows 8.1 начинает волноваться из-за нехватки ОЗУ, потому что, очевидно, мое приложение использует наибольшее количество ОЗУ, когда у него огромные резервы видеоданных записать на диск. Есть ли способ сказать Windows, что мои процессы важнее других, чтобы Windows начала убивать другие менее важные процессы?
CreateMemoryResourceNotification
что гораздо менее хакерский.