Я написал приложение .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
что гораздо менее хакерский.Ответы:
Windows не убивает процессы при использовании всей оперативной памяти. На самом деле происходит то, что процессам не удается выделить память и происходит сбой.
Это происходит из-за того, что вся ваша физическая память используется и поскольку файл подкачки отключен, диспетчер памяти больше не может писать страницы, которые не используются. Это сохраняет вашу физическую оперативную память заполненной, и когда ваш процесс или что-либо еще, запущенное в данный момент, пытается выделить страницу, происходит сбой. Некоторые приложения аварийно завершают работу.
Эта презентация от Technet объясняет: http://channel9.msdn.com/Events/TechEd/NorthAmerica/2011/WCL405
Файл подкачки защищает приложения от сбоев, когда вы используете всю свою память, выступая в качестве поддержки для чрезмерной приверженности.
Виртуальная память - в значительной степени основа того, как современные операционные системы распределяют ресурсы, поэтому все дело в том, чтобы в оперативной памяти были занятые вещи, а также переносить данные с диска на диск.
На самом деле есть только два ответа:
Суть в том, что ОЗУ - это просто еще один уровень кеша, и все, что связано с виртуальной памятью, файлами подкачки, файлами отображения памяти и всем, что в основном сводится к следующему: если у вас заканчивается память, вам нужно добавить Больше.
источник
Зайдите в Панель инструментов Windows и Расширенные настройки и отключите ненужные вещи, такие как эффекты окон, если вы этого еще не сделали, и получите Sysinternals Process Explorer и / или System Monitor, чтобы найти и отключить все постороннее, что тратит впустую процессор или память.
Что еще более важно, используйте Process Explorer и / или System Monitor, чтобы наблюдать за тем, как работает ваша программа, и точно знать, где и как она терпит неудачу. Какой поток не хватает памяти и умирает первым - основной prgm или часть ffmpeg? Существует ли определенный dll или другой общий ресурс, размер которого неожиданно увеличивается? Или выполнение идет правильно, за исключением того, что откусывает больше, чем может прожевать данные?
Более точное выяснение характера вашей проблемы, скорее всего, укажет вам решение. Например, вы можете более агрессивно реализовывать политику отбрасывания кадров, оптимизируя при этом более высокий критерий порции 8–10 секунд, чтобы снизить общую нагрузку на ОЗУ.
Заключительные предложения: Возможно, стоит подумать о переходе на Linux, а тем временем снова включить файл подкачки (linux называет его пространством подкачки, что делает его звучащим более увлекательным, IMHO, как своп-встреча или что-то в этом роде!) Удачи.
источник