Far*_*rth 7 memory arrays excel vba excel-vba
我发现的众多资源表明,VBA代码的数组大小取决于机器中的内存量.然而,对我来说并非如此.我正在运行以下非常简单的代码来测试:
Sub test6()
Dim arr(500, 500, 500) As Boolean
End Sub
Run Code Online (Sandbox Code Playgroud)
但是,如果我将大小更改为600x600x600,则会出现内存不足错误.我正在使用的机器有16Gb的RAM,所以我怀疑物理RAM是个问题.
我正在使用Excel 2007.是否有一个让VBA使用更多RAM的技巧?
如果有一个Application.UseMoreMemory()
我们可以调用的函数会很好:-)
,我什么都不知道。
我见过的所有文档都说它受内存限制,但这不是物理内存是问题,而是您可以使用的虚拟地址空间。
您应该记住,虽然从500增加到600仅看起来是一个适度的增长(尽管20%本身就足够大了),但是由于您是从三个维度进行的,因此它的效果接近两倍。存储要求。
Excel 2007从内存中将短整数(16位)用于布尔类型,因此,最少500 3个数组将占用约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
Run Code Online (Sandbox Code Playgroud)
与往常一样,它取决于阵列所需的功能及其使用模式。