Подтвердить что ты не робот

Как создать (32-разрядное) приложение .NET для использования 3 ГБ оперативной памяти?

Я создаю приложение .NET(С#), которое должно использовать много оперативной памяти. Недавно я знал, что в 32-разрядных версиях Windows XP я могу использовать только 2 ГБ, если только я не использую переключатель /3Gb и не устанавливаю флаг IMAGE_FILE_LARGE_ADDRESS_AWARE в исполняемом заголовке. Но поскольку я разрабатываю приложение .NET, я думаю, что я не могу напрямую изменить исполняемый файл, не так ли? Итак, что мне делать, чтобы мое приложение могло использовать 3 ГБ?

4b9b3361

Ответ 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-переключатель.