Пределы для многомерных массивов - PullRequest
0 голосов
/ 24 сентября 2011

Я только что создал многомерный массив размером 1024 x 1024 x 1024. Я получаю исключение OutOfMemory.Какой многомерный массив наибольшего размера безопасен для использования?Я делаю это на VB.net, поэтому все ответы .net приемлемы.

РЕДАКТИРОВАТЬ

Когда я сказал, что безопасно, я имею в виду, хороший размер для примернолюбой компьютер.Какой размер будет работать без проблем на 32-битной операционной системе.Я не понял, что размер 1024 был 4G.Я надеюсь на что-то шестнадцатое.

Ответы [ 3 ]

1 голос
/ 24 сентября 2011

Этот вопрос не имеет смысла, по крайней мере, без двух других деталей:

  • Доступная память на компьютере
  • Размер каждой памяти

Получить эти числа, а затем посчитай.Предполагая, что 32-разрядные целые числа без упаковки, массив 1024 *1024* 1024 будет занимать примерно 4 ГБ (на самом деле, массивы .NET не являются массивами C и имеют некоторые накладные расходы; я не знаю достаточно об их реализации)оценить, насколько велики накладные расходы).Вы можете использовать такой массив, , если , вы хотите ограничить использование программы 64-разрядными компьютерами с огромными (более 4 ГБ, по крайней мере, потому что ваша программа не будетбыть единственным работающим) объемами памяти.Скорее всего, компьютеры, на которых вы собираетесь запускать свою программу, не такие мощные.Затем вам нужно будет выяснить, какой минимум вы хотите / нужно поддерживать, и поработать над математикой, чтобы оценить, сколько памяти вы можете удобно использовать.

1 голос
/ 24 сентября 2011

.NET объекты не могут быть больше 2 гигабайт.Даже тогда в 32-разрядной операционной системе очень маловероятно, чтобы дыра в адресуемой виртуальной памяти была достаточно большой для такого большого массива.Вы можете получить около 600 мегабайт сразу после запуска вашей программы, быстро снижаясь после того, как адресное пространство начнет фрагментироваться.Бомбардировка с выделением 90 МБ при наличии еще половины свободного места не является чем-то необычным.

Вам потребуется использовать зубчатые массивы и 64-разрядную операционную систему.И немного самоанализа, если вам действительно нужен такой массивный массив.Массивы - это своего рода старая школа после System.Collections.Generic.С классами коллекций, которые работают так же быстро, как массивы и , позволяют вам платить только за то, что вы фактически используете.Рекомендуется.

1 голос
/ 24 сентября 2011

Ну, 1024 *1024* 1024 - это очень большое число. Предположим, вы используете целочисленный массив, тогда это соответствует 4 ГиБ памяти, не считая затрат на управление несколькими массивами.

Поскольку ни один процесс не может выделить более 2 ГБ памяти, вы превысили жесткий предел, установленный операционной системой (, а не VB или .NET!). У самого .NET здесь нет реального ограничения, поскольку ограничение машины достигается гораздо быстрее.

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