Мне нужно создать матрицу размером 10000х100000. Моя оперативная память составляет 4 ГБ. Он работает до 25-й итерации (отладка), но после 25-й итерации я получаю ошибку «неправильное распределение», однако используется только 25% ОЗУ, что означает, что проблема не связана с памятью. Так что я могу сделать?
РЕДАКТИРОВАТЬ:
int **arr;
arr=new int*[10000];
for(i=0;i<10000;i++)
arr[i]=new int[100000];
Мое распределение выше.
Если вы компилируете для x64, проблем не должно быть.
Если вы компилируете для x86 (скорее всего), вы можете включить /LARGEADDRESSAWARE
флаг компоновщика, если вы используете Visual C ++ или что-то подобное для других компиляторов. Для Visual C ++ этот параметр также можно найти в свойстве Linker -> System -> Enable Large Addresses в IDE.
Это устанавливает флаг в результирующем EXE-файле, сообщая ОС, что код может обрабатывать адреса более 2 ГБ. При запуске такого исполняемого файла в Windows x64 (в вашем случае) ОС выделяет 4 ГБ адресного пространства для игры, а не 2 ГБ в обычном режиме.
Я проверил ваш код на моей системе, Windows 7 x64, 8 ГБ, скомпилирован с Visual C ++ Express 2013 (x86, конечно) с флагом компоновщика, и код работал нормально — выделил почти 4 ГБ без ошибок.
В любом случае, 25-я итерация слишком быстра для того, чтобы она провалилась, независимо от того, где она выполняется и как она компилируется (это примерно 10 МБ), так что там что-то не так.
Кстати, HEAP
Параметр компоновщика в этом случае не помогает, так как он не увеличивает максимальный размер кучи, он просто указывает, какое адресное пространство нужно зарезервировать изначально и в каких порциях увеличить объем выделенной оперативной памяти. Короче говоря, это в основном для целей оптимизации.
Возможным решением будет использование вашего жесткого диска.
просто откройте файл и сохраните необходимые данные.
затем просто скопируйте нужные данные в буфер.
Даже если вам удастся выделить такое количество данных в куче
вы будете перегружать кучу данными, которые, скорее всего, не будете использовать большую часть времени.
В конце концов вам может не хватить места, что приведет к снижению производительности или к неожиданному поведению.
Если вы беспокоитесь о снижении производительности при использовании жесткого диска, возможно, к вашей проблеме подойдет процедурное решение. Если бы вы могли в любой момент предоставить нужные вам данные, а не хранить их, вы могли бы решить и вашу проблему.
Если вы используете VS, вы, вероятно, захотите попробовать КУЧА опцию компоновщика и убедитесь, что вы компилируете для 64-битной цели, потому что в противном случае у вас не хватит адресного пространства. Размер вашей физической памяти не должен быть ограничивающим фактором, поскольку окна могут использовать файл подкачки для предоставления дополнительной памяти.
Однако, с точки зрения производительности, вероятно, это ужасная идея — просто выделить матрицу такого размера. Возможно, вам следует подумать об использовании матрицы запасных частей или (в соответствии с предложением LifePhilPsyPro) сгенерировать данные по запросу.
Для выделения очень больших буферов лучше всего использовать службы операционной системы для отображения страниц в адресное пространство, а не new / malloc.
Вы пытаетесь выделить более 4 ГБ.