Увеличить размер кучи visual studio

Обновлено: 16.07.2024

Я пытаюсь цитировать скрипт .py. Это графический интерфейс PyQt5 с большим количеством кнопок QToolButton и рабочим EventFilter. Модуль c построен успешно, однако компиляция не выполняется из-за следующей ошибки:

d: \ stuff \ mapform2a.c (11338): фатальная ошибка C1002: компилятору не хватает места в куче на проходе 2 ССЫЛКА: фатальная ошибка LNK1257: ошибка генерации кода: команда 'C: \ Program Files (x86) \ Microsoft Visual Studio 14.0 \ VC \ BIN \ x86_amd64 \ link.exe 'не удалось со статусом выхода 1257

Компилятор взят из Visual Studio 2019. Python 3.5.5 (да, старый, я знаю, но у меня есть причины . ).

Есть ли способ увеличить размер кучи при попытке "cythonize -i script.py"?

Документация Cython действительно не ясна по этому поводу (по крайней мере, для не-C-эксперта . )

ИЗМЕНИТЬ Полный журнал выглядит следующим образом:

C: \ temp \ MapForm> python setup.py build_ext --inplace Компиляция MapForm2A.py, поскольку она изменилась. [1/1] Cythonizing MapForm2A.py C: \ Anaconda3 \ lib \ site-packages \ Cython \ Compiler \ Main.py: 369: FutureWarning: директива Cython 'language_level' не установлена, пока используется 2 (Py2). Это изменится в более позднем выпуске! Файл: C: \ temp \ MapForm \ MapForm2A.py tree = Parsing.p_module (s, pxd, full_module_name) запуск build_ext создание расширения 'MapForm2A' создание сборки создание сборки \ temp.win-amd64-3.5 создание сборки \ temp.win- amd64-3.5 \ Release C: \ Program Files (x86) \ Microsoft Visual Studio 14.0 \ VC \ BIN \ x86_amd64 \ cl.exe / c / nologo / Ox / W3 / GL / DNDEBUG / MD -IC: \ Anaconda3 \ include - IC: \ Anaconda3 \ include "-IC: \ Program Files (x86) \ Microsoft Visual Studio 14.0 \ VC \ INCLUDE" "-IC: \ Program Files (x86) \ Microsoft Visual Studio 14.0 \ VC \ ATLMFC \ INCLUDE" "- IC: \ Program Files (x86) \ Windows Kits \ 10 \ include \ 10.0.18362.0 \ ucrt "" -IC: \ Program Files (x86) \ Windows Kits \ 10 \ include \ 10.0.18362.0 \ shared "" -IC: \ Program Files (x86) \ Windows Kits \ 10 \ include \ 10.0.18362.0 \ um "" -IC: \ Program Files (x86) \ Windows Kits \ 10 \ include \ 10.0.18362.0 \ winrt "/TcMapForm2A.c / Fobuild \ temp.win-amd64-3.5 \ Release \ MapForm2A.obj MapForm2A.c создает C: \ temp \ MapForm \ build \ lib.win-amd64-3.5 C: \ Program Files (x86) \ Microsoft Visual Studio 14.0 \ VC \ BIN \ x86_amd64 \ li nk.exe / nologo / INCREMENTAL: NO / LTCG / DLL / MANIFEST: EMBED, / MANIFESTUAC: NO / LIBPATH: C: \ Anaconda3 \ libs / LIBPATH: C: \ Anaconda3 \ PCbuild \ amd64 "/ LIBPATH: C : \ Program Files (x86) \ Microsoft Visual Studio 14.0 \ VC \ LIB \ amd64 "" / LIBPATH: C: \ Program Files (x86) \ Microsoft Visual Studio 14.0 \ VC \ ATLMFC \ LIB \ amd64 "" / LIBPATH: C : \ Program Files (x86) \ Windows Kits \ 10 \ lib \ 10.0.18362.0 \ ucrt \ x64 "" / LIBPATH: C: \ Program Files (x86) \ Windows Kits \ 10 \ lib \ 10.0.18362.0 \ um \ x64 "/ ЭКСПОРТ: PyInit_MapForm2A build \ temp.win-amd64-3.5 \ Release \ MapForm2A.obj /OUT:build\lib.win-amd64-3.5\MapForm2A.cp35-win_amd64.pyd /IMPLIB:build\temp.win-amd64 -3.5 \ Release \ MapForm2A.cp35-win_amd64.lib MapForm2A.obj: предупреждение LNK4197: экспорт 'PyInit_MapForm2A' указан несколько раз; с использованием первой спецификации Создание сборки библиотеки \ temp.win-amd64-3.5 \ Release \ MapForm2A.cp35-win_amd64.lib и сборки объекта \ temp.win-amd64-3.5 \ Release \ MapForm2A.cp35-win_amd64.exp Создание кода c: \ temp \ mapform \ mapform2a.c (7545): фатальная ошибка C1002: компилятору не хватает места в куче на проходе 2 ССЫЛКА: фатальная ошибка LNK1257: ошибка генерации кода: команда 'C: \ Program Files (x86) \ Microsoft Visual Studio 14.0 \ VC \ BIN \ x86_amd64 \ link.exe 'не удалось со статусом выхода 1257

Установочный файл довольно стандартный:

Модуль представляет собой чистый PyQt5 (вывод pyuic5) без других зависимостей и отлично работает, если интерпретируется напрямую без Cython.

РЕДАКТИРОВАТЬ: РЕШЕНИЕ (Может кому-то понадобится). Спасибо @DavidW (обсуждение в комментариях ниже).

Как можно увеличить максимальный объем памяти, выделяемый в стеке / куче для программы на C ++?

Будет ли увеличение оперативной памяти вашего компьютера автоматически увеличивать объем стека / кучи памяти компьютерной программы?

Решение

Другие решения

Вы можете указать зарезервированный размер кучи и размер стека с помощью параметров ссылок / Куча и / Стек в Visual Studio. Для получения дополнительной информации проверьте эти статьи MSDN:

Второе редактирование: Из вашего комментария я вижу, что вы работаете в Windows, поэтому мой ответ по Unix, приведенный ниже, не будет для вас очень полезным. Но смотри Определение стекового пространства с помощью Visual Studio а также C / C ++ максимальный размер стека программы .

стек Размер часто ограничен в Linux. Команда ulimit -s выдаст текущее значение в килобайтах. Вы можете изменить значение по умолчанию (обычно) в файле /etc/security/limits.conf.

Вы также можете, в зависимости от привилегий, изменить его для каждого отдельного процесса, используя setrlimit() , Смотри например мой ответ в Ошибка сегментации: выделение стека в программе на C в Ubuntu при буферизации>4M .

За куча, см. например Ограничение размера кучи в C . Но я не верю, что вы можете увеличить или уменьшить максимальный размер.

Размер кучи процесса обычно ограничен максимальной памятью, которую процесс может выделить. Куча не обязательно должна быть смежной (если вы не делаете что-то вроде malloc (1000000000)), чтобы куча могла использовать большую часть доступного адресного пространства.

В Windows максимальный размер процесса зависит от нескольких факторов.

При использовании 32-битной Windows 32-битный процесс может по умолчанию выделить 2 ГБ.
Если Windows загружается с помощью параметра / 3GB, а процесс компилируется с использованием флага компоновщика «Включить большие адреса», то процесс может выделить 3 ГБ.

При использовании 64-битной Windows 32-битный процесс по умолчанию может выделить 2 ГБ.
Если процесс связан с «Включить большие адреса», то 64-разрядная Windows позволяет 32-разрядному процессу выделять 4 ГБ.

64-битный процесс (в 64-битной Windows) может выделить что-то вроде 16 000 ГБ.

У меня возникли проблемы с памятью с кучей по умолчанию и резервным размером стека 1 МБ. Но когда я установил выше свойства 2 МБ (2000000), он работает нормально.

Чтобы установить эти свойства в среде разработки Visual Studio, выполните следующие действия.

Я столкнулся с запутанным делом, написанным в одной из моих книг в колледже:
Там говорится, что "куча не является статичной и может расти по мере необходимости, запрашивая больше памяти из операционной системы".

Так что я запутался в следующем: предположим, что я запускаю свое приложение, а объекты выделяются в куче. В какой-то момент у приложения заканчивается память: что происходит сейчас?

Из того, что я понимаю, Gc (сборщик мусора) пинает и начинает его отмечать и выполнять развертки. Интересно, почему-то, вместо того, чтобы ссылаться на Gc на CLR, есть ли возможность для кучи запрашивать больше памяти из операционной системы?

спросил(а) 2020-03-04T17:07:34+03:00 1 год, 8 месяцев назад ответил(а) 2020-03-04T17:24:12.325313+03:00 1 год, 8 месяцев назад

Важно понимать, что ошибка "из памяти" не означает, что вы не в физической памяти. Это означает, что у вас нет виртуальной памяти. В 32-битном приложении есть 2 ^ 32 возможных адреса для элемента в виртуальном адресном пространстве приложений.

Операционная система отвечает за отображение разделов этого виртуального адресного пространства на реальные физические носители, будь то оперативная память, жесткий диск или любое другое устройство хранения. Поскольку большинство приложений не используют подавляющее большинство своего виртуального адресного пространства, большая часть его отображается ни к чему и ничего не соответствует, пока они не начнут ее использовать.

В то время как возможно изменение программы, как это происходит, какие блоки виртуальной памяти соответствуют фактическим блокам физической памяти (которые необходимы для того, чтобы программа использовала сразу более 2 ^ 32 слова памяти) так что это необычно, обычно это делается только такими программами, как приложения для обработки видео, которые действительно требуют хранения большого количества памяти одновременно. Этот процесс также является ручным. если вы не вручную заменяете то, что каждый блок карт виртуальной памяти может выходить из виртуальной памяти, даже если у вас все еще есть устройства хранения данных, способные хранить больше информации. Это ошибка с памятью.

Если у вас есть 64-битное приложение, вы можете в основном заменить все экземпляры 32 на 64 в этом ответе.

ответил(а) 2020-03-04T17:07:34+03:00 1 год, 8 месяцев назад

Куча динамична в том смысле, что когда вы добавляете ее в кучу, она растет. Он создает указатели в некотором смысле в других местах памяти. Всегда существует ограничение на размер памяти, которую может принимать приложение, пока не закончится память. Когда предел достигнут, вы, как правило, получите исключение из памяти.

ответил(а) 2020-03-29T20:25:28+03:00 1 год, 7 месяцев назад

Вы можете выделить МНОГО БОЛЬШЕ памяти, чем

Справа вверху диалогового окна сборки "Configuration Manager" щелкните стрелку вниз и выберите опцию "&ltnew > ". Откроется диалоговое окно "Новая платформа решений".

В диалоговом окне "Новая платформа решений" для опции "Платформа" выберите "x64" в раскрывающемся меню. Затем нажмите кнопку "ОК", и новая опция сборки x64 теперь будет доступна в диалоговом окне "Диспетчер конфигурации".

В области "Проводник" Visual Studio щелкните правой кнопкой мыши значок CS Project и выберите "Свойства" в всплывающем меню (последний параметр внизу этого меню). Это откроет окно свойств проекта CS.

В левой части окна свойств проекта CS щелкните вкладку "Создать", чтобы отобразить свойства сборки для вашего проекта кода. В верхней части этого окна обратите внимание, что теперь "Платформа" должна сказать "x64" (в отличие от опции "Любой процессор" по умолчанию). Если раскрывающийся список "Платформа" не показывает "x64", вы должны выбрать его сейчас.

Затем просто создайте свой код и в папке "bin", теперь у вас должна быть папка x64 с новой 64-разрядной версией вашего приложения.

Использование 64-разрядной сборки вашего приложения в 64-разрядной ОС Windows позволит вашей программе выделять гораздо больше, чем

2 ГБ памяти, предположительно до 2 ^ 64 адресных пространств (если у вас есть ОЗУ и дисковое пространство доступные, которые являются реальными ограничивающими факторами на момент написания ответа).

Если у вас STILL нехватка памяти в вашем приложении, вы также можете увеличить размер файла страницы памяти Windows. В Windows файл страницы позволяет операционной системе переводить память из ОЗУ на диск, если в нем не хватает памяти оперативной памяти. Но при переключении разделов оперативной памяти на диск и с диска большие затраты времени, поэтому это может сильно повлиять на производительность вашего приложения. Независимо от производительности, увеличивая размер страницы, вы могли (теоретически) сделать файл с файлом настолько большим, насколько это доступно на диске C: на вашем компьютере Windows. В этом случае ваше приложение сможет выделять, например, до 4 ТБ памяти (или любой объем памяти, на который установлен размер файла вашей страницы) во время выполнения вашей программы. Чтобы изменить параметры файла страницы для вашего компьютера Windows, выполните следующие действия:


    Откройте диалоговое окно "Свойства системы" , щелкнув правой кнопкой мыши на "Этот ПК" и выбрав "Свойства" во всплывающем меню. Это также можно выполнить в более поздних версиях Windows (Windows 10, Win 2012 Server и т.д.), Перейдя в "Начать" > "Панель управления" > "Система и безопасность" > "Система".

В левой части диалогового окна "Система" нажмите "Дополнительные параметры системы". Это покажет вкладку "Дополнительно" в устаревшем диалоговом окне "Свойства системы" для Windows.

На вкладке "Дополнительно" в унаследованном диалоговом окне "Свойства системы" нажмите кнопку "Настройки" в поле "Производительность". Это будет опция диалога "Параметры производительности".

В диалоговом окне "Параметры производительности" перейдите на вкладку "Дополнительно" , чтобы просмотреть текущую настройку размера файла страницы памяти Windows.

Чтобы увеличить размер файла страницы, нажмите кнопку "Изменить", и откроется диалоговое окно "Виртуальная память".

В диалоговом окне "Виртуальная память" выберите диск "C:", затем в разделе "Пользовательский размер" установите значения "Начальный" и "Максимальный". Вы можете использовать любой размер с максимальным объемом свободного места на диске C:, но внесение этого изменения зарезервирует это пространство для файла страницы на жестком диске.

Я использую Visual Studio 2010 Win 8. У меня есть класс, где я делаю 2Д массив для хранения игровых данных для игры.

создайте пустое консольное приложение и сделайте main.cpp и добавьте этот код. Использование 360 для MAP_SIZE вызывает переполнение стека с помощью 359 не делает. С чего бы это? Я ищу массив гораздо большего размера. Я бы хотел что - то вроде 2000-10,000 в идеале.

мои оценки ставить sizeof(Tile) на 8 или больше. Это значит sizeof(Server) по крайней мере 360*360*8 = 1036800, которая составляет 0,99 МБ. Стек обычно небольшой, и 1MB является общим размером по умолчанию. Вместо этого вы должны выделить плитки в куче, возможно, используя std::vector .

вы выделяете массив 360 x 360 Tile объекты на стеке. Это плохая идея с самого начала. Вам выделяется очень большой блок памяти в стеке. Стек не предназначен для такого типа использования.

эта память должна быть статической, если вам нужен только один экземпляр и вы заранее знаете размер, или вы должны выделить ее из кучи (используя new или даже malloc() ).

рассмотреть конструктор Server выделить память используя new вместо того, чтобы делать это так, как вы это делаете.

стек имеет ограниченный размер. Если вам нужно держать большой массив, используйте динамическое распределение.

вы создали тип, который требует

1 МБ пространства стека на экземпляр, который, по-видимому, больше, чем может вместить ваш стек.

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

размер стека по умолчанию равен 1 Мб. ваш размер структуры = ushort (2bytes) + ulong (4byte)= 6 байт, которые компилятор преобразует в 8 байт для выравнивания структуры . так что . 8*360*360 =1036800 байт, незначительно выше 1 МБ

1-выравнивание остановки силы:

Это позволит для максимального MAP_SIZE= sqrt (1024*1024/6)=418 ,так что это позволяет для большего размера карты, но не размер вы хотите

2-можно изменить visual studio параметры, позволяющие компилятору и компоновщику использовать более 1 МБ в стеке: вам нужно изменить его, чтобы он был больше максимального размера карты, который вам нужен 8*10000*10000

    щелкните правой кнопкой мыши проект и выберите Свойства из меню .

перейдите в свойства конфигурации - >C / C++-> Командная строка, добавьте этот параметр:

enter image description here

перейти к конфигурации свойства->Компоновщик->командная строка, добавьте этот параметр

enter image description here

3-третье решение-динамический массив для распределения по куче, а не статический массив , как все сказали.

Читайте также: