Есть ли ограничение памяти для одного процесса.NET
В настоящее время мы думаем о создании кеш-системы для хранения данных, извлеченных из базы данных SQL, и сделать их доступными для нескольких других приложений (веб-сайт, веб-сервис и т. Д.). Мы представляем, что кеш работает как служба Windows и в основном состоит из интеллектуального словаря, который содержит записи в кеш. У меня вопрос, есть ли ограничение на рабочий набор приложения (оно будет работать под Windows Server 2003)? Или количество физической памяти ограничено?
6 ответов
32 бит или 64 бит? 32 бита - 2 ГБ (для процесса), 64 бита - 1 ТБ (сервер Enterprise Edition 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.
В 32-битной Windows вы можете получить немного больше памяти, загрузив Windows с флагом /3gb и пометив ваше приложение как "большой адрес"
Matthias,
На самом деле это не ответ на прямой вопрос, а еще один способ решения этой проблемы, который поможет обойти некоторые серьезные ловушки, которые могут стать серьезной головной болью при использовании решений для кэширования. (Извините, я не рекомендую читать по этому вопросу.)
Мы реализовали это в предыдущем проекте, и это создало другие проблемы.
Для автономного доступа, можете ли вы использовать sql express на рабочих столах для создания зеркала вашей базы данных (или только той части, которая вам нужна для кэширования)? Затем все, что вам нужно сделать, это переключить базу данных, на которую указывает ваше приложение. Вы даже можете использовать его для хранения различий и воспроизведения их на сервере - хотя это имеет другие проблемы. Вы можете изменить разрешения для локальной копии, чтобы сделать ее доступной только для чтения, если так и должно быть.
Словари, о которых вы думаете, создают удивительно похожие на индексы Sql. Я бы рассчитывал на то, что sql выполнит эту работу за вас, если вы сможете создать ее таким образом. Зачем изобретать это колесо? Если вы это сделаете, вам придется тщательно продумать срок действия кэша и управление памятью, особенно если это служба Windows.
Удачи,
Сэм
Как и в любой другой программе Windows, вы ограничены адресным пространством. То есть: на 32-битной, вы можете иметь 2 ГБ адресного пространства. На x64 у вас может быть 8TB.
Если у вас нет 8 ТБ физической памяти, она начнет работать на странице.