Как создать (32-разрядное) приложение .NET для использования 3 ГБ ОЗУ? - PullRequest
12 голосов
/ 21 января 2009

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

Ответы [ 6 ]

13 голосов
/ 21 января 2009

.NET exe по-прежнему является стандартным PE-файлом; так что вы можете попробовать использовать editbin /LARGEADDRESSAWARE для установки флага, но учтите, что это не сработает, если вы используете что-то вроде ClickOnce (так как он поддерживает криптографический хеш файлов).

Тем не менее, обратите внимание, что вы по-прежнему будете иметь те же ограничения .NET с точки зрения максимального размера одного объекта / массива. Для больших объемов памяти лучше использовать x64.

6 голосов
/ 21 января 2009
Переключатель

/ 3GB находится в загрузчике ОС, а не в ваших приложениях. (РЕДАКТИРОВАТЬ: Он также присутствует в нативных компиляторах C / C ++, но не в компиляторе C #) Что касается вашего приложения, оно будет запрашивать память, а ОС отдает ее вашему процессу. Однако у вас есть доступ к еще 1 гигабайту (потенциально, вы не всегда получаете 3 гигабайта в зависимости от вашей аппаратной периферии), прежде чем ваша программа использует виртуальную память.

Как указал мне Марк Гавелл, вам может потребоваться запустить команду "editbin / LARGEADDRESSAWARE my.exe" в качестве опции пост-сборки в вашем exe-файле, чтобы включить это. Нашел ссылку на человека, говорящего об этом здесь: Форумы MS

Могу ли я предложить вам взглянуть на вашу программу и посмотреть, сможете ли вы перестроить ее, чтобы использовать меньше памяти. Возможно, вы могли бы иметь дело с набором данных меньшими порциями, вместо того, чтобы пытаться загрузить все это сразу в память?

1 голос
/ 21 января 2009

Вы также должны увеличить максимальный размер рабочего набора вашего процесса: см. API SetProcessWorkingSetSize .

0 голосов
/ 21 января 2009

Вы можете попробовать использовать Remoting через Named Pipes и получить больше памяти, физически имея больше процессов.

Если вы выполняете какую-либо форму взаимодействия (и здесь подсчитываются обычные сокеты .Net), вам следует создать кэш объектов (например, с сокетами в буфере byte []), который выделяет большое количество этих объектов при запуске приложения. *

Вы должны прочитать эту статью .

0 голосов
/ 21 января 2009

Ну, я не уверен в этом, но вот что я думаю:

Исполняемый файл .NET может быть скомпилирован двумя способами - в зависимости от платформы и независимо от платформы. По умолчанию они не зависят от платформы, и код (как уже упоминалось в других ответах) при запуске программы приводится в соответствие с кодом конкретной платформы.

Теперь, например, если ваш исполняемый файл является одним из этих независящих от платформы, и вы запускаете его на 64-битной ОС, он будет переведен в JIT в 64-битный код, верно? Таким образом, он сможет адресовать более 3 ГБ ОЗУ.

То, что я пытаюсь сказать, - я не думаю, что это вообще имеет значение, что написано в заголовке PE. Фактический объем доступной оперативной памяти определяется средой выполнения .NET, которая, в свою очередь, смотрит на текущую платформу и выдает лучший JIT-код, какой только может.

Думаю, вам не стоит беспокоиться о ключе / 3GB, так как .NET позаботится об этом за вас. Доверьтесь .NET! :)

0 голосов
/ 21 января 2009

Насколько я помню, ключ / 3GB можно использовать только для Windows Server (2000 или 2003), но не для Windows XP. Вам нужно написать / 3GB в конце файла boot.ini. Таким образом, для приложений ОС предоставляет больше памяти, которую она обычно выделяет для использования процессами ядра. Однако / 3 ГБ не означает, что вы можете использовать 3 ГБ памяти для своего приложения, он просто может использовать больше памяти, но не обязательно должен быть 3 ГБ. Для приложений .net, опять же, насколько я помню, с ключом / 3GB вы можете использовать до 1,8 ГБ памяти. Кстати, вы также можете проверить / PAE переключатель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...