Существует ли ограничение памяти для одного процесса .NET?

StackOverflow https://stackoverflow.com/questions/200348

Вопрос

В настоящее время мы думаем о создании системы кэширования для хранения данных, извлеченных из базы данных SQL, и предоставления их нескольким другим приложениям (веб-сайту, веб-сервису и т. д.).Мы представляем, что кеш работает как служба Windows и по сути состоит из интеллектуального словаря, в котором хранятся записи кэша.У меня вопрос: есть ли ограничение на рабочий набор приложения (оно будет работать под Windows Server 2003)?Или объем физической памяти является пределом?

Это было полезно?

Решение

32бит или 64бит?32-битная версия — 2 ГБ (для процесса), 64-битная — 1 ТБ (сервер корпоративной версии 2003).

Однако максимальный размер объекта CLR составляет 2 ГБ. даже на 64битной.

Обновлять: информация выше была верной в 2008 году.Видеть Ответ Охада для получения более свежей информации.Сервер Windows 2016 может иметь максимум 24 ТБ.

Другие советы

Недавно я проводил обширное профилирование ограничений памяти в .NET в 32-битном процессе.Нас всех засыпает мыслью, что мы можем выделить до 2,4 ГБ (2^31) в приложении .NET, но, к сожалению, это не так :(.Процесс приложения имеет очень много места для использования, и операционная система отлично справляется с этим за нас, однако у самой .NET, похоже, есть свои собственные накладные расходы, которые составляют примерно 600-800 МБ для типичных реальных приложений, которые превышают лимит памяти. .Это означает, что как только вы выделите массив целых чисел размером около 1,4 ГБ, вы должны ожидать появления OutOfMemoryException().

Очевидно, что в 64-битной версии этот предел наступает намного позже (давайте поговорим через 5 лет :)), но общий размер всего в памяти также растет (я считаю, что он составляет от ~ 1,7 до ~ 2 раз) из-за увеличения размера слова.

Что я знаю наверняка, так это то, что идея виртуальной памяти в операционной системе определенно НЕ дает вам практически бесконечное пространство для распределения внутри одного процесса.Это сделано только для того, чтобы все 2,4 ГБ были адресованы всем (многим) приложениям, работающим одновременно.

Следующая таблица из MSDN это самый точный ответ на ваш вопрос.Обратите внимание, что флаг IMAGE_FILE_LARGE_ADDRESS_AWARE нельзя установить непосредственно из управляемого компилятора, хотя, к счастью, его можно установить после сборки. через утилиту editbin.4GT относится к флагу /3gb.

alt text

В 32-битной Windows вы можете получить немного больше памяти, загрузив Windows с флагом /3gb и пометив свое приложение как «с поддержкой больших адресов».

Матиас,

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

Мы реализовали это в предыдущем проекте, и это создало другие проблемы.

Для автономного доступа можете ли вы использовать sql express на настольных компьютерах для создания зеркала вашей базы данных (или только той части, которую вам нужно кэшировать)?Затем все, что вам нужно сделать, это переключить базу данных, на которую указывает ваше приложение.Вы даже можете использовать его для хранения различий и воспроизведения их на сервере, хотя здесь есть и другие проблемы.Вы можете изменить разрешения для локальной копии, чтобы сделать ее доступной только для чтения, если так и должно быть.

Словари, которые вы собираетесь создать, очень похожи на индексы Sql.Я бы полагался на sql, который выполнит всю работу за вас, если вы сможете спроектировать ее таким образом.Зачем изобретать велосипед?Если вы это сделаете, вам придется тщательно подумать об истечении срока действия кэша и управлении памятью, особенно если это служба Windows.

Удачи,

Сэм

Как и в любой другой программе Windows, вы ограничены адресным пространством.То есть:в 32-битной версии вы можете иметь 2 ГБ адресного пространства.На x64 у вас может быть 8 ТБ.

Если у вас нет 8 ТБ физической памяти, начнется подкачка.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top