Я написав додаток .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
це набагато менш хакі.