Ограничение на выделение памяти в Windows + я правильно рассчитываю - PullRequest
2 голосов
/ 13 июля 2011

Я пишу программу, которая требует много памяти (анализ больших графов).

В настоящее время в моей программе есть две основные структуры данных (занимающие большую часть памяти).Это:

  • * матрица * n типа int **
  • и массив длины n, типа Node *

Узел, в этомcase, это структура, содержащая два целых числа (sizeof(Node) = 8)

Самое большое значение для n, на котором я могу запустить свой код, - 22900, немного вычисляя, что я получаю:

22900*22900 * sizeof(int) * 8 + 22900 * sizeof(Node) = 16782591360 bits

Это 1,95375077 Гигабайт.

Итак, вопрос 1: правильно ли я вычисляю использование памяти для этих двух структур данных?и 2: есть ли ограничение в 2 ГБ на окнах.Если так, как я могу обойти это?

Для получения дополнительной информации я нахожусь на 64-битной машине Windows 7, компилирующей с GCC, 4 ГБ ОЗУ с ~ 3 ГБ свободной ОЗУ во время работы.

Спасибо.

Ответы [ 4 ]

3 голосов
/ 13 июля 2011

Вы не правильно рассчитали.Во-первых, нет смысла что-либо умножать на 8. Квант выделения в C - это байт, а не бит.Во-вторых, вы игнорируете массив указателей, который реализует первое измерение вашей матрицы.Итак:

22900 * sizeof(int*) + 22900*22900*sizeof(int) + 22900*sizeof(Node) = 2097914800 bytes

Что касается полезного совета, я оставлю это (уже опубликованному) другому ответу.

3 голосов
/ 13 июля 2011

Скорее всего, вы компилируете для 32-битных; в Windows 32-разрядные процессы ограничены 2 ГБ адресуемого пространства ( с 64-разрядной ОС и установленным флагом IMAGE_FILE_LARGE_ADDRESS_AWARE, 4 ГБ ). Скомпилируйте для 64-битной системы, и вы увидите, что ваш лимит памяти существенно возрастет. Тем не менее, вы, вероятно, захотите больше физической памяти, прежде чем делать это; вы уже используете половину, и нажатие свопа приведет к снижению производительности.

2 голосов
/ 13 июля 2011

32-битные процессы ограничены 2 ГБ памяти, адресуемой пользователем (в большинстве версий Windows с настройками по умолчанию). 64-битные процессы имеют гораздо большие адресные пространства. См. Эту заметку Производительность и потребление памяти под WOW64 , чтобы дать 32-битному приложению адресное пространство 4G (хотя не уверен, что GCC сможет создать исполняемые образы с этим флагом).

Скомпилируйте ваш код как 64-битное приложение, и этот предел должен исчезнуть (попробуйте MinGW-w64 ).

1 голос
/ 13 июля 2011

Чтобы обойти ограничение памяти, вы должны скомпилировать программу в 64-битном режиме; обратите внимание, что указатели имеют размер 8 байт. Общее использование памяти матрицы будет затем удвоено.

...