我发现的许多资料表明,VBA 代码的数组大小取决于机器中的内存量。然而,这对我来说并非如此。我正在运行以下非常简单的代码来测试:
Sub test6()
Dim arr(500, 500, 500) As Boolean
End Sub
但是,如果我将大小更改为 600x600x600,则会出现内存不足错误。我使用的机器有 16Gb 的 RAM,所以我怀疑物理 RAM 是问题。
我使用的是 Excel 2007。是否有让 VBA 使用更多 RAM 的技巧?
最佳答案
如果有一个我们可以调用的 Application.UseMoreMemory()
函数就好了:-)
唉,我一个都不知道。
我看到的所有文档都说它受内存限制,但问题不是物理内存,而是您可以使用的虚拟地址空间。
您应该记住,虽然从 500 增加到 600 看起来只是适度的增加(尽管 20% 本身就足够大了),因为您是在三个维度上这样做的,所以结果是存储需求接近两倍。
根据内存,Excel 2007 使用短整数(16 位)作为 bool 类型,因此,您的 5003 数组至少会占用大约 250M (500x500x500x2)。
将所有尺寸增加到 600 会得到 600x600x600x2,或大约 432M。
在 32 位机器中可能拥有的 2G 可用地址空间内一切正常(我不知道 Excel 2007 有 64 位版本),但是这些东西是 < em>不小,而且你还必须与其他东西共享该地址空间。
看看你从什么时候开始开始得到错误会很有趣。
作为第一步,我将研究对如此大的阵列的需求。它可能以不同的方式可行,例如对数组进行分区,以便在任何时候只有一部分在内存中(类似于手动虚拟内存)。
对于真正的随机访问来说,这不太可能表现得那么好,但对于更多的顺序访问来说应该不会太糟糕,并且至少会让你继续前进(一个缓慢的解决方案比一个不工作的解决方案更可取)。
另一种可能性是抽象出位处理,以便您的 bool 值实际上存储为位而不是单词。
您必须为 getBool
和 setBool
提供函数,在单词数组上使用位掩码运算符,同样,性能不会那么崩溃,但你至少可以达到相当于:
' Using bits instead of words gives 16 times as much. '
Dim arr(8000, 8000, 8000) As Boolean
与往常一样,这取决于您需要数组的用途及其使用模式。
关于arrays - Excel 2007 VBA 数组大小限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7817427/