我最近需要在VBA
Excel 2010中使用相当大的数组执行计算。然而,令我沮丧的是,我的计算机在工作和家中(一台是PC而另一台是Mac(PC有) 8GB的RAM和Mac有4GB)),当我尝试运行我的程序时,继续抛出相同的Out of Memory
错误。这使我开始进行一些测试以找到问题的根源。
Sub Test1()
Dim arr1() As Byte, arr2() As Long
ReDim arr1(1 To 268000000) ''These work
ReDim arr2(1 To 268000000)
End Sub
Sub Test2()
Dim arr3() As Byte, arr4() As Long
ReDim arr3(1 To 269000000) '' Both of these fail
ReDim arr4(1 To 269000000)
End Sub
现在,根据MSDN,每个维度的索引都受(2 ^ 31) - 1
限制。正如您在上面所看到的那样,我远未接近{1}}。根据一些原始计算,上面每个阵列的内存量是:
2^28
您会注意到arr1: 268,000,000 * 1 = 268,000,000 bytes of memory
arr2: 268,000,000 * 8 = 2,144,000,000 bytes of memory
arr3: 269,000,000 * 1 = 269,000,000 bytes of memory
arr4: 269,000,000 * 8 = 2,152,000,000 bytes of memory
大约arr3
大小1/8th
,但在尝试arr2
时,我们会在Redim arr3
时遇到内存不足错误完美无缺。这里发生了什么?应该注意的是this post虽然相似但不适用,因为我在两台机器上都有足够的内存,并且只是简单地询问内存而不是一个可以放入数组的元素。