18

Я написал приложение .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 начала сначала убивать другие менее важные процессы?

2 ответа2

45

Windows не убивает процессы при использовании всей оперативной памяти. На самом деле происходит то, что процессам не удается выделить память и происходит сбой.

Это происходит из-за того, что вся ваша физическая память используется и поскольку файл подкачки отключен, диспетчер памяти больше не имеет возможности писать страницы, которые не используются. Это сохраняет вашу физическую оперативную память заполненной, и когда ваш процесс или что-либо еще запущенное в данный момент пытается выделить страницу, происходит сбой. Некоторые приложения аварийно завершают работу.

Эта презентация от Technet объясняет:http://channel9.msdn.com/Events/TechEd/NorthAmerica/2011/WCL405

Файл подкачки удерживает приложения от сбоев, когда вы используете всю свою память, выступая в качестве поддержки для чрезмерной приверженности.

Виртуальная память - это в значительной степени основа того, как современные операционные системы распределяют ресурсы, поэтому все дело в том, чтобы в оперативной памяти было что-то, что используется, и перемещение и извлечение файлов с диска.

На самом деле есть только два ответа:

  1. Снова включите файл подкачки и увеличьте объем оперативной памяти на вашем компьютере, чтобы уменьшить перегрузку диска.
  2. Уменьшите требования к памяти вашего приложения.

Суть в том, что ОЗУ - это просто еще один уровень кеша, и все, что связано с виртуальной памятью, файлами подкачки, файлами отображения памяти и всем, что в основном сводится к следующему: если у вас заканчивается память, вам нужно добавить Больше.

0

Зайдите в Панель инструментов Windows и Расширенные настройки и отключите ненужные вещи, такие как эффекты окна, если вы еще этого не сделали, и получите Sysinternals Process Explorer и / или System Monitor, чтобы найти и отключить все постороннее, что тратит впустую процессор или память.

Что еще более важно, используйте Process Explorer и / или System Monitor, чтобы посмотреть, как выполняется ваша программа, и точно увидеть, где и как она терпит неудачу. Какой поток не хватает памяти и умирает первым - основной prgm или часть ffmpeg? Существует ли определенный dll или другой общий ресурс, размер которого неожиданно увеличивается? Или выполнение выполняется правильно, за исключением того, что откусывает больше, чем может прожевать данные?

Более точное выяснение характера вашей проблемы, скорее всего, укажет вам направление решения. Например, вы могли бы более агрессивно реализовать политику отбрасывания кадров и оптимизировать ее по критерию порции 8–10 секунд, чтобы снизить общую нагрузку на ОЗУ.

Заключительные предложения: Возможно, стоит подумать о переходе на Linux, а тем временем снова включить файл подкачки (linux называет его пространством подкачки, что делает его звучание более увлекательным, IMHO, как swap-meet или что-то в этом роде!) Удачи.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .