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