Excel VBA Ошибка нехватки памяти при инициализации массива - PullRequest
0 голосов
/ 07 февраля 2020

Я сталкиваюсь с ошибкой в ​​Excel 2010 (32-разрядная версия) при попытке инициализировать массив. В частности, в сообщении об ошибке говорится: «Недостаточно памяти». Следует также отметить, что я пишу код на 64-разрядной машине с 32 ГБ ОЗУ.

Это код, который я использую:

   Sub ArrayTest()
   Dim C As Variant
   ReDim C(50257, 768) As Variant
   Dim row As Integer
   Dim column As Integer

   For row = 1 To UBound(C, 1)
       For column = 1 To UBound(C, 2)
           C(row, column) = rnd
       Next
   Next
   End Sub

Ошибка возникает при попытке ReDim C ().

То, что я пробовал до сих пор:

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

Кто-то рекомендовал мне использовать массив байтов. Однако байтовые массивы могут захватывать только целочисленные данные. Так что это тоже не сработало. Другим вариантом, который я рассмотрел, было использование Win32 API, чтобы посмотреть, можно ли выделить массив в памяти за пределами Excel. В частности, функция VirtualAllo c (). На самом деле я еще не пробовал это, так как я не уверен, что это сработает. Мне сказали, что если используемая вами основная программа 32-битная, то она не будет работать.

Во всяком случае, в этот момент я озадачен тем, что мне следует делать. Я могу рассмотреть возможность использования базы данных Access для хранения данных (50257 x 768 = 38 597 376 элементов данных). Это значительно замедлит код.

Есть ли способы обойти это?

1 Ответ

1 голос
/ 07 февраля 2020

Я полагаю, что Excel имеет ограничение на использование памяти в 4 ГБ. Variant type занимает 16 байтов .

Таким образом, у вас есть 50257*768*16 байтов, выделенных только для redim этого монстра. Это 6,175,580,288 или 6,1 Гб.

Если вместо этого вы объявите этот массив как Double, вы уменьшите его вдвое, поэтому ~ 3 ГБ или объявите его как Single, чтобы четверть размера ~ 1,5 ГБ, и это может сработать.

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