Я создаю приложение .NET(С#), которое должно использовать много оперативной памяти. Недавно я знал, что в 32-разрядных версиях Windows XP я могу использовать только 2 ГБ, если только я не использую переключатель /3Gb
и не устанавливаю флаг IMAGE_FILE_LARGE_ADDRESS_AWARE
в исполняемом заголовке. Но поскольку я разрабатываю приложение .NET, я думаю, что я не могу напрямую изменить исполняемый файл, не так ли? Итак, что мне делать, чтобы мое приложение могло использовать 3 ГБ?
Как создать (32-разрядное) приложение .NET для использования 3 ГБ оперативной памяти?
Ответ 1
.NET exe по-прежнему является стандартным PE файлом; поэтому вы можете попробовать с помощью editbin /LARGEADDRESSAWARE
установить флаг, но обратите внимание, что это не сработает, если вы используете что-то вроде ClickOnce (так как это поддерживает криптографический хэш файлов).
Однако обратите внимание, что вы по-прежнему будете иметь те же пределы .NET, что и максимальный размер одного объекта/массива. Для огромного объема памяти x64 - лучшая идея.
Ответ 2
Переключатель/3GB находится в загрузчике ОС, а не в ваших приложениях. (EDIT: он также присутствует в собственных компиляторах C/С++, но не в компиляторе С#). Что касается вашего приложения, он запросит память, и ОС предоставит ее вашему процессу. Однако у вас есть доступ к еще одному концерту (возможно, вы не всегда получаете 3gig в зависимости от вашей аппаратной периферии), прежде чем ваша программа будет использовать виртуальную память.
Как указал мне Марк Гавелл, вам может понадобиться запустить команду "editbin/LARGEADDRESSAWARE my.exe" в качестве опции post build на вашем exe, чтобы включить это. Нашел ссылку на человека MS, говорящего об этом здесь: Форумы MS
Могу я предложить вам посмотреть на свою программу и посмотреть, можете ли вы перестроить ее, чтобы использовать меньше памяти. Возможно, вы могли бы иметь дело с набором данных в небольших кусках, а не пытаться сразу загрузить все это в память?
Ответ 3
Вы также должны увеличить максимальный рабочий размер вашего процесса: см. SetProcessWorkingSetSize API.
Ответ 4
Ну, я не уверен в этом, но это то, что я думаю:
Исполняемый файл .NET может быть скомпилирован двумя способами: независимым от платформы и независимым от платформы. По умолчанию они независимы от платформы, а код (как упоминалось в других ответах) JIT'ed для кода конкретной платформы при запуске программы.
Теперь, например, если ваш исполняемый файл является одним из этих независимых от платформы, и вы запускаете его в 64-разрядной ОС, он будет JIT'ом до 64-битного кода, верно? Таким образом, он сможет более эффективно решать проблему 3 ГБ оперативной памяти.
То, что я пытаюсь сказать, - я не думаю, что это вообще имеет значение, что написано в заголовке PE. Фактический объем доступной ОЗУ определяется средой выполнения .NET, которая, в свою очередь, смотрит на текущую платформу и создает лучший JIT-код, который он может использовать.
Я думаю, вам не стоит беспокоиться о переключателе /3GB, поскольку .NET позаботится об этом для вас. Доверие к .NET!:)
Ответ 5
Вы можете попробовать использовать Remoting через Named Pipes и получить больше памяти, физически имея больше процессов.
Если вы делаете какую-либо форму interop (и здесь подсчитываете нормальные .Net сокеты), вы должны создать кеш объекта (например, с сокетами, байтом [] buffer), который выделяет большое количество этих объектов при запуске приложения.
Вы должны прочитать эта статья.
Ответ 6
Насколько я помню, переключатель 3GB может использоваться только для Windows Server (2000 или 2003), но не для Windows XP. Вам нужно написать /3GB в конце файла boot.ini. Таким образом, для приложений ОС позволяет больше памяти, которую она обычно выделяет для использования для процессов ядра. Тем не менее, /3GB не означает, что вы можете использовать 3 ГБ памяти для своего приложения, он просто может использовать больше памяти, но не обязательно должен быть 3 ГБ. Для приложений .net, насколько я помню, с переключателем /3GB вы можете использовать до 1,8 ГБ памяти. Кстати, вы также можете проверить/PAE-переключатель.