Как зарезервировать память для моего приложения и оставить указанную сумму оставшейся?


Я планирую приложение, которое будет включать загрузку большого количества изображений одновременно и, следовательно, требует большого объема памяти. Например, я мог бы иметь 50 объектов изображений, созданных одновременно, занимая в общей сложности 1 ГБ оперативной памяти. Но когда пользователь загружает еще 20 картинок, я хотел бы убедиться, что этот объем памяти уже зарезервирован и готов.

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

Так, например, если компьютер имеет 2048 Мб оперативной памяти, и опция установлена, чтобы оставить 50 МБ свободной для других приложений, и уже есть 10 МБ оперативной памяти, используемой другими приложениями, то он должен зарезервировать 2048-50-10 = 1988 МБ для моего приложения.

Проблема, которую я предвижу, заключается в том, что пользователь открывает другое приложение, которое требует 1 ГБ. Мое приложение должно поймать это и сжать себя.

Звучит ли это вообще как осуществимый подход? В принципе, мне нужно убедиться, что в любой момент времени зарезервировано как можно больше памяти, оставляя при этом приличное количество для других приложений. Окажет ли это значительное влияние на производительность, если я сделаю это, или не сильно вообще? Возможно, я загружаюсь и разгружаюсь. изображения на быстрых шагах, и я не хочу, чтобы он резервировал/освобождал эту память по требованию, я хочу, чтобы она оставалась зарезервированной.

2 8

2 ответа:

+1 для упоминания Sertac о том, как SQL Server ездит по линии выделения памяти, которая ему нужна, но освобождает память, когда Windows жалуется.

Приложения могут получать жалобы окна с помощью CreateMemoryResourceNotification:

hLowMemory := CreateMemoryResourceNotification(LowMemoryResourceNotification);

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

Любой поток вызова процесс может указать дескриптор уведомления ресурса памяти в вызове к тому же ... QueryMemoryResourceNotification функция или одна из функций ожидания . Состояние объекта сигнализируется, когда задано состояние памяти существует. Это общесистемное мероприятие, поэтому все приложения получают уведомление, когда объект сигнализируется. Примечание что существует диапазон доступности памяти, где ни LowMemoryResourceNotification или HighMemoryResourceNotification объект есть сигнал. В этом случае приложения должны попытаться сохранить использование памяти константа.

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

Остается только решить, хотите ли вы освободить некоторые изображения, когда Windows говорит, что у нее заканчивается оперативная память. Но если вы не используете память, она будет заменена на диск для вас.

Нереально учитывать другие приложения. Просто игнорировать их. Система будет пролистывать страницы по мере необходимости. Если вы действительно хотите сделать это, вам придется динамически адаптироваться к другим процессам, когда они начинаются и заканчиваются. Это действительно нереально. Более того, непрактично спрашивать у других процессов, сколько им требуется памяти. Оставьте все это системе.

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

Если вы подчеркиваете доступные ресурсы, то убедитесь, что вы используете FastMM и включите LARGE_ADDRESS_AWARE для вашего приложения, чтобы получить адресное пространство 4 ГБ при работе на 64-битной ОС.