Было бы неплохо, если бы была функция Application.UseMoreMemory()
, которую мы могли бы просто вызвать: -)
Увы, я не знаю ни одного.
Все документы, которые я видел, говорят, что она ограничена памятью, но проблема не в физической памяти, а в виртуальном адресном пространстве, которое вам доступно.
Вы должны иметь в виду, что, хотя увеличение с 500 до 600 выглядит только как умеренное увеличение (хотя 20% само по себе достаточно велико), потому что вы делаете это в трех измерениях, оно получается почти вдвое больше требований к хранению.
Из памяти Excel 2007 использовал короткие целые числа (16 бит) для логического типа, поэтому, как минимум, ваш массив 500 3 займет около 250M (500x500x500x2).
Увеличение всех размеров до 600 даст вам 600x600x600x2 или около 432M.
Все в пределах доступного адресного пространства 2G, которое вы, вероятно, имеете на 32-битной машине (я не знаю, что в Excel 2007 была 64-битная версия), но эти вещи не маленький, и вы должны разделить это адресное пространство и с другими вещами.
Было бы интересно узнать, с какого момента вы начали получать ошибки.
В качестве первого шага я бы рассмотрел необходимость такого большого массива. Это может быть осуществлено по-другому, например, разделение массива так, чтобы только одна его часть находилась в памяти одновременно (своего рода виртуальная память вручную).
Маловероятно, что это действительно хорошо для действительно произвольного доступа, но не должно быть слишком плохо для более последовательного доступа и, по крайней мере, поможет вам (медленное решение предпочтительнее нерабочего).
Другая возможность - абстрагироваться от обработки битов, чтобы ваши логические значения на самом деле сохранялись в виде битов, а не слов.
Вы должны были бы предоставить функции для getBool
и setBool
, используя операторы битовой маски для массива слов, и, опять же, производительность не была бы такой высокой, но вы по крайней мере сможете тогда перейти к эквиваленту:
' Using bits instead of words gives 16 times as much. '
Dim arr(8000, 8000, 8000) As Boolean
Как всегда, это зависит от того, для чего вам нужен массив, и от особенностей его использования.